1. 套接字选项函数原型:

#include <sys/socket.h>

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

ret-成功返回0 失败返回-

2. 通用套接字选项:

(1) SO_BROADCAST:

本选项开启或禁止进程发送广播消息的能力;只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上;

(2) SO_DEBUG:

本选项仅由TCP支持。当给一个TCP套接字开启本选项,内核将为TCP在该套接字和接收的所有分组保留详细跟踪信息。这些信息保存在内核的某个环形缓冲区中,并可以使用trpt程序进行检查;

(3) SO_DONTROUTE:

本选项规定外出的分组将绕过底层协议的正常路由机制,以强制将分组从特定接口送出;

(4) SO_ERROR:

当一个套接字上发生错误时,源自Berkeley的内核中的协议模块将该套接字的名为so_error的变量设为标准的Unix_Exxx值中的一个,我们称它为该套接字的待处理错误。内核能够以下面的两种方式之一立即通知进程这个错误;

--如果进程阻塞在对该套接字的select调用上,那么无论是检查可读条件还是可写条件,select均返回并设置其中一个或所有两个条件;

--如果进程使用信号驱动式I/O模型,那就给进程或者进程产生一个SIGIO信号;

进程然后可以通过访问SO_ERROR套接字选项后去so_error值。由getsockopt返回的整数值就是该套接字的待处理错误。so_error随后由内核复位为0;

(5) SO_KEEPALIVE:

给一个tcp套接字设置保持存活选项后,如果2小时内在该套接字的任一方向上没有数据交换,tcp就自动给对端发送一个保持存活探测分节。这是一个对端必须响应的tcp分节,它会导致以下三种情况之一;

--对端以期望的ack响应。应用进程得不到通知。在又经过无动静的2小时之后,tcp将发出另外一个探测分节;

--对端以rst响应,它告知本端tcp,对端已崩溃且重新启动。该套接字的待处理错误被置ECONNRESET,套接字本身则被关闭;

--对端对保持存活探测分节没有任何响应。源自Berkeley的tcp将另外发送8个探测分节,两两相隔75秒,视图得到一个响应。如果探测分节没有响应,该套接字的处理错误被置为ETIMEOUT;

(6) SO_LINGER:

--shutdown, SHUT_RD: 在套接字上不能再发出接收请求,进程仍可以网套接字发送时数据,套接字接收缓冲区中所有数据被丢弃;再接收到任何的tcp丢弃;对套接字发送缓冲区没有任何影响;

--shutdown, SHUT_WR: 在套接字上不能再发出发送请求,进程仍可以从套接字接收数据,套接字发送缓冲区中的内容被发送到对端,后跟正常的tcp连接终止序列,即发送fin,对套接字接收缓冲区没有任何影响;

--close,l_onoff=0: 在套接字上不能再发出发送或者接收请求;套接字发送缓冲区中的内容被发送到对端,如果描述符引用计数变为0,在发送完发送缓冲区中的数据后,跟以正常的tcp连接终止序列,套接字接收缓冲区中的内容被丢弃;

--close,l_onoff = 1, l_linger = 0: 在套接字上不能再发出发送或接收请求;如果描述符引用计数变为0,rst被发送到对端;连接状态被置为CLOSED(没有TIME_WAIT);套接字发送缓冲区和套接字接收缓冲区中的数据被丢弃;

--close, l_onoff = 1, l_linger != 0: 在套接字上不能再发出发送或者接收请求;套接字发送缓冲区的数据被发送到对端;如果描述符引用计数为0,在发送完缓冲区中的数据后,跟以正常的tcp连接终止序列;套接字接收缓冲区的数据被丢弃;如果在连接变为CLOSED状态前延滞时间到,那么colose返回EWOULDBLOCK错误;

(7) SO_RCVBUF, SO_SNDBUF:

每个套接字都有一个发送缓冲区和一个接收缓冲区;TCP套接字的缓冲区大小至少应该是MSS的4倍;MSS=MTU-40头部,一般以太网卡MTU是1500;典型缓冲区默认大小是8192字节或者更大;对于一次发送大量数据,可以增加到48K,64K等;为了达到最佳性能,缓冲区可能至少要与BDP(带宽延迟乘积)一样大小;对于接收大量数据的,提高接收缓冲区能够减少发送端的阻塞;

TCP设置这个两个选项注意顺序:对于客户端必须在调用connect之前,对于服务器端应该在调用listen之前,因为窗口选项是在建立连接时用syn分节与对端互换得到的;

(8) SO_RCVLOWAT, SO_SNDLOWAT:

每个套接字还有一个接收低水位标记和一个发送低水位标记。他们由select函数使用,接收低水位标记是让select返回可读时套接字接收缓冲区中所需的数据量;对于tcp,udp,默认值是1;发送低水位标记是让select返回可写时套接字发送缓冲区中所需的可用空间;对于tcp套接字,其默认值通常为2048;

(9) SO_RCVTIMEO, SO_SNDTIMEO:

这两个选项允许我们给套接字的接收和发送设置一个超时值,注意,访问getsockopt和setsockopt函数的参数是指向timeval的指针,与select所用的参数相同;

(10) SO_TYPE:

本选项返回套接字的类型,返回的整数值是一个注入SOCK_STREAM或者SOCK_DGRAM之类的值;本选项通常由启动时继承了套接字的进程使用;

(11) SO_USELOOPBACK:

本选项仅用于路由域(AF_ROUTE)套接字,默认设置是打开,相应套接字 将接收在其上发送的任何数据报的一个副本;

(12) SO_REUSEADDR:

TCP先调用close()的一方会进入TIME_WAIT状态,只有设置了SO_REUSEADDR选项的socket,才可以重复绑定使用。server程序总是应该在调用bind之前设置SO_REUSEADDR套接字选项。

这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不可能。

3. tcp套接字选项:

(1) TCP_MAXSEG:

本选项允许我们获取或者设置TCP连接的最大分节大小(MSS)。已建立连接返回的是对端使用syn通知的MSS值,否则是未从对端收到MSS情况下使用的默认值;

(2) TCP_NODELAY:
开启本选项将禁止TCP的Nagle算法,默认情况下Nagle算法是启动的;关于Nagle算法,单独总结一篇;

通用套接字选项和TCP套接字选项的更多相关文章

  1. TCP套接字端口复用SO_REUSEADDR

    下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...

  2. TCP套接字选项SO_LINGER与TCP_LINGER2

    概述 本文对两个LINGER相关的套接字选项进行源码层面的分析,以更明确其各自的作用和区别: man page SO_LINGER,该选项是socket层面的选项,通过struct linger结构来 ...

  3. TCP套接字编程模型及实例

    摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...

  4. Linux系统C语言socket tcp套接字编程

    1.套接字的地址结构: typedef uint32_t in_addr_t; //32位无符号整数,用于表示网络地址 struct in_addr{ in_addr_t s_addr; //32位 ...

  5. UNIX网络编程——基本TCP套接字编程

    一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...

  6. <网络编程>基本TCP套接字编程

    tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...

  7. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  8. LINUX TCP套接字详细配置

    提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.要提高 Linux系统下的负载能力,可以先启用Apache的Worker模式 ...

  9. UNP学习笔记1——基本TCP套接字编程

    1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...

随机推荐

  1. Access Denied for user root @localhost 解决方案

    问题描述: C:\Users\bo.wang> mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for us ...

  2. Go语言【第六篇】:Go循环语句

    Go语言循环语句 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句,以下为大多数编程语言循环程序的流程如: Go语言提供了以下几种类型循环处理语句: 循环类型 描述 fo ...

  3. 【题解】51nod1327 棋盘游戏

    那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~ 当天自己做的时候,主要想到的是两点 : 1.按列dp 2.对行进行排 ...

  4. ES6装饰器Decorator基本用法

    1. 基本形式 @decorator class A {} // 等同于 class A {} A = decorator(A); 装饰器在javascript中仅仅可以修饰类和属性,不能修饰函数.装 ...

  5. cloneNode与事件拷贝

    用法: var newNode = oldNode.cloneNode(deep); //deep,布尔值,若为true,则克隆oldNode及其子节点,否则只克隆oldNode本身 关于复制事件 1 ...

  6. Redis 的安装配置介绍

    redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyth ...

  7. android内核源码下载和编译

    1.下载编译 新建kernel目录 ~/srcAndroid/src4.4.4_r1/kernel目录下,输入命令: seven@ThinkPad:~/srcAndroid/src4.4.4_r1/k ...

  8. lamp 源码安装

    #!/bin/bash #description:mysql-.tar apache2.4.23 php5.6.27 function check_ok(){ ] then echo "-- ...

  9. 搭建openresty需要注意到的地方

    openresty的完整包放在百度云盘linux目录下 一键安装openresty ./install.sh 安装好后,修改nginx.conf配置文件 cd /usr/local/openresty ...

  10. crontab使用进程锁解决冲突

    想到一个问题,如果在crontab里有个定时任务设置为一分钟执行一次,但是它执行的时间可能会超过一分钟,此时crontab一分钟后会再次运行该脚本吗?这样会不会出现冲突呢?网上找了下,说可以用Linu ...