ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

套接字选项

2019-11-04 20:55:12  阅读:212  来源: 互联网

标签:选项 对端 int 响应 接字 optval


之前读过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连接。

 

等待更新...

标签:选项,对端,int,响应,接字,optval
来源: https://www.cnblogs.com/zhuiyicc/p/11794777.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有