1. SO_BROADCAST 套接字选项服务器
本选项开启或禁止进程发送广播消息的能力。只有数据报套接字支持广播,而且还必须是在支持广播消息的网络上(例如以太网,令牌环网等)。咱们不可能在点对点链路上进行广播,也不可能在基于链接的传输协议(例如TCP和SCTP)之上进行广播。网络
2. SO_DEBUG 套接字选项socket
本选项仅由TCP支持。当给一个TCP套接字开启本选项时,内核将为TCP在该套接字发送和接受的全部分组保留详细跟踪信息。这些信息保存在内核的某个环形缓冲区中,并可以使用trpt程序进行检查。函数
3. SO_KEEPALIVE 套接字选项spa
给一个TCP套接字设置保持存活选项后,若是2小时内在该套接字的任何一方向上都没有数据交换,TCP就自动给对端发送一个保持存活探测分节。这是一个对端必须相应的TCP分节,它会致使如下3种状况之一。指针
(1)对端以指望的ACK响应。应用进程得不到通知(由于一切正常)。在又通过仍无动静的2小时后,TCP将发出另外一个探测分节。进程
(2)对端以RST响应,它告知本端TCP:对端已崩溃且已从新启动。该套接字的待处理错误被置为ECONNRESET,套接字自己则被关闭。get
(3)对端对保持存活探测分节没有任何响应。it
若是根本没有对TCP的探测分节的响应,该套接字的待处理错误就被置为ETIMEOUT,套接字自己则被关闭。然而若是该套接字收到一个ICMP错误做为某个探测分节的响应,那就返回响应的错误,套接字自己也被关闭。select
本选项的功能是检测对端主机是否崩溃或变的不可达(譬如拨号调制解调器链接掉线,电源发生故障等等)。若是对端进程崩溃,它的TCP将跨链接发送一个FIN,这能够经过调用select很容易的检测到。
本选项通常由服务器使用,不过客户也可使用。服务器使用本选项时由于他们花大部分时间阻塞在等待穿越TCP链接的输入上,也就是说在等待客户的请求。然而若是客户主机链接掉线,电源掉电或者系统崩溃,服务器进程将永远不会知道,并将继续等待永远不会到达的输入。咱们称这种状况为半开链接。保持存活选项将检测出这些半开链接并终止他们。
4. SO_LINGER 套接字选项
本选项指定close函数对面向链接的协议(例如TCP和SCTP,但不是UDP)如何操做。默认操做是close当即返回,可是若是有数据残留在套接字发送缓冲区中,系统将试着把这些数据发送给对端。
5. SO_RCVBUF和SO_SNDBUF套接字选项
每一个套接字都有一个发送缓冲区和一个接收缓冲区。
接收缓冲区被TCP,UDP和SCTCP用来保存接收到的数据,直到由应用进程读取。对于TCP来讲,套接字接收缓冲区可用空间的大小限制了TCP通告对端的窗口大小。TCP套接字接收缓冲区不能够溢出,由于不容许对端发出超过本端所通告窗口大小的数据。这就是TCP的流量控制,若是对端无视窗口大小而发出了超过窗口大小的数据,本端TCP将丢弃它们。然而对于UDP来讲,当接收到的数据报装不进套接字接收缓冲区时,该数据报就被丢弃。回顾一下,UDP是没有流量控制的:较快的发送端能够很容易的淹没较慢的接收端,致使接收端的UDP丢弃数据报。
这两个套接字选项容许咱们改变着两个缓冲区的默认大小。对于不一样的实现,默认值得大小能够有很大的差异。若是主机支持NFS,那么UDP发送缓冲区的大小常常默认为9000字节左右的一个值,而UDP接收缓冲区的大小则常常默认为40000字节左右的一个值。
当设置TCP套接字接收缓冲区的大小时,函数调用的顺序很重要。这是由于TCP的出口规模选项时在创建链接时用SYN分节与对端互换获得的。对于客户,这意味着SO_RCVBUF选项必须在调用connect以前设置;对于服务器,这意味着该选项必须在调用listen以前给监听套接字设置。给已链接套接字设置该选项对于可能存在的出口规模选项没有任何影响,由于accept直到TCP的三路握手玩抽才会建立并返回已链接套接字。这就是必须给监听套接字设置本选项的缘由。
6. SO_RCVLOWAT 和 SO_SNDLOWAT套接字选项
每一个套接字还有一个接收低水位标记和一个发送低水位标记。他们由select函数使用,这两个套接字选项容许咱们修改这两个低水位标记。
接收低水位标记是让select返回“可读”时,套接字接收缓冲区中所需的数据量。对于TCP,UDP和SCTP套接字,其默认值为1。发送低水位标记是让select返回“可写”时套接字发送缓冲区中所需的可用空间。对于TCP套接字,其默认值一般为2048。UDP也使用发送低水位标记,然而因为UDP套接字的发送缓冲区中可用空间的字节数从不改变(意味UDP并不为由应用进程传递给它的数据报保留副本),只要一个UDP套接字的发送缓冲区大小大于该套接字的低水位标记,该UDP套接字就老是可写。咱们记得UDP并无发送缓冲区,而只有发送缓冲区大小这个属性。
7. SO_RCVTIMEO 和 SO_SNDTIMEO套接字选项
这两个选项容许咱们给套接字的接收和发送设置一个超时值。注意,访问他们的getsockopt和setsockopt函数的参数是指向timeval结构的指针,与select所用参数相同。这可以让咱们用秒数和微妙数来规定超时。咱们经过设置其值为0s和0μs来禁止超时。默认状况下着两个超时都是禁止的。
接收超时影响5个输入函数:read,readv,recv,recvfrom和recvmsg。发送超时影响5个输出函数:write,writev,send,sendto和sendmsg。
8. SO_REUSEADDR 和 SO_REUSEPORT 套接字选项
SO_REUSEADDR套接字选项能起到如下4个不一样的功用。
(1)SO_REUSEADDR容许启动一个监听服务器并捆绑其众所周知的端口,即便之前创建的将该端口用做他们的本地端口的链接仍存在。这个条件一般是这样碰到的:
(a)启动一个监听服务器;
(b)链接请求到达,派生一个子进程来处理这个客户;
(c)监听服务器终止,但子进程继续为现有链接上的客户提供服务;
(d)重启监听服务器。
默认状况下,当监听服务器在步骤d经过调用socket,bind和listen从新启动时,因为他试图捆绑一个现有链接(即正由早先派生的那个子进程处理着的链接)上的端口,从而bind调用会失败。可是若是该服务器在socket和bind两个调用之间设置了SO_REUSEADDR套接字选项,那么将成功。全部TCP服务器都应该指定本套接字选项,以容许服务器在这种状况下被从新启动。
(2)SO_REUSEADDR容许在同一端口上启动同一服务器的多个实例,只要每一个实例捆绑一个不一样的本地IP地址便可。对于TCP,咱们绝对不可能启动捆绑相同IP地址和相同端口号的多个服务器:这是彻底重复的捆绑,即便咱们给第二个服务器设置了SO_REUSEADDR套接字也无论用。
(3)SO_REUSEADDR 容许单个进程捆绑同一端口到多个套接字上,只要每次捆绑指定不一样的本地IP地址便可。
(4)SO_REUSEADDR容许彻底重复的捆绑:当一个IP地址和端口号已绑定到某个套接字上时,若是传输协议支持,一样的IP地址和端口还能够捆绑到另外一个套接字上。通常来讲本特性仅支持UDP套接字。