套接字选项
之前读过unix网络编程,现在在看nginx源码,很多套接字选项不记得了,因此每遇到一个套接字选项就在此文章中进行补充。
1.获取和设置套接字选项的方法:
getsockopt,setsockopt函数
fcntl函数
ioctl函数
2.4种函数简介:
I.getsockopt,setsockopt函数
int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen);
int setsockopt(int sockfd,nt level,int optname,const void* optval,socklen_t optlen);
sockfd必须是一个打开的套接字描述符,level指定系统中解释选项的代码或为通用套接字代码或为某个特定于协议的代码。optval 是一个指向某个变量的指针,setsockopt从*optval中取得选项待设置的新值,getsockopt则将获取的选项值放入*optval中。*optval的大小由最后一个参数指定,因此,获取或者设置的数据类型一定要一一对应。
3.套接字选项:
这里我将分不同的level来进行描述,但套接字选项可能和书上的顺序不同,标志字段为0表示禁用,否则启用。
I.SOL_SOCKET
SO_KEEPALIVE,可获得,可设置。数据类型为int,是一个标志字段。此选项的功能在于检测对端主机是否崩溃或者不可达。
如果启用SO_KEEPALIVE选项,如果2小时内该套接字上两端没有数据交换,那么设置了该标志的一端的TCP将自动给对端发送一个保持存活探测分节(keep-alive probe)。它会导致以下三种情况:
A.对端以期望的ACK响应,则一切正常,发送端的进程不会收到任何通知。
B.对端以RST响应,它告知发送端TCP,对端已崩溃且已重新启动。该套接字的待处理错误被置为ECONNRESET,套接字被关闭。
C.对端对此探测分节无响应,不同的系统可能会有不同的响应,但一般都是另外再发送多个探测分节,发送的相隔时间也因系统而不同,有些系统的相隔时间不一定相同。如果没有探测分节的响应,则该套接字的待处理错误被置为ETIMEOUT,套接字被关闭。但如果套接字收到一个ICMP错误,那就返回响应响应错误(EHOSTUNREACH),这仅仅说明了对端主机不可达而已,这种情况下套接字也被关闭。
上述的2小时是否能被改变呢,在TCPv1附录E中给出了内核如何修改定时参数,但一般由内核使用的改变,会使得所有的套接字都采取此定时参数。
为什么要采用本选项?
一般是服务器使用此选项,因为服务器使用了大部分的时间等待对端的输入,然而如果对端掉线或者崩溃或者关机,服务器将不会知道并继续等待输入,设置此选项可以有效的终止这些TCP连接。
等待更新...