setsockeopt关于LINGER的解释
2012-06-27 14:47
197 查看
在MSDN中查找setsockeopt关于LINGER的解释如下:
Setting the SO_DONTLINGER option prevents blocking on member function Close while waiting for unsent data to be sent. Setting this option is equivalent
to setting SO_LINGER with l_onoff set to 0.
若设置了SO_LINGER,并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。
若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。
若在一个流类套接口上设置了SO_DONTLINGER,则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。
简言之,setsockeopt函数使用SO_LINGER规定了断开SOCKET时处理未发送完的数据的动作。
查询UNIX文档中关于SO_LINGER参数的解释更加详细:
SO_LINGER
此选项指定函数close对面向连接的协议如何操作(如TCP)。缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。
SO_LINGER选项用来改变此缺省设置。使用如下结构:
struct linger {
int l_onoff; /* 0 = off, nozero = on */
int l_linger; /* linger time */
};
有下列三种情况:
l_onoff为0,则该选项关闭,l_linger的值被忽略,等于缺省情况,close立即返回;
l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;
l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。如果套接口缓冲区中仍残留数据,进程将处于睡眠状态,直 到:(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述字访问计数为0);(b)延迟时间到。此种情况下,应用程序检查close的返回值是
非常重要的,如果在数据发送完并被确认前时间到,close将返回EWOULDBLOCK错误且套接口发送缓冲区中的任何数据都丢失。close的成功返 回仅告诉我们发送的数据(和FIN)已由对方TCP确认,它并不能告诉我们对方应用进程是否已读了数据。如果套接口设为非阻塞的,它将不等待close完成。
l_linger的单位依赖于实现,4.4BSD假设其单位是时钟滴答(百分之一秒),但Posix.1g规定单位为秒。
Setting the SO_DONTLINGER option prevents blocking on member function Close while waiting for unsent data to be sent. Setting this option is equivalent
to setting SO_LINGER with l_onoff set to 0.
若设置了SO_LINGER,并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。
若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。
若在一个流类套接口上设置了SO_DONTLINGER,则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。
简言之,setsockeopt函数使用SO_LINGER规定了断开SOCKET时处理未发送完的数据的动作。
查询UNIX文档中关于SO_LINGER参数的解释更加详细:
SO_LINGER
此选项指定函数close对面向连接的协议如何操作(如TCP)。缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。
SO_LINGER选项用来改变此缺省设置。使用如下结构:
struct linger {
int l_onoff; /* 0 = off, nozero = on */
int l_linger; /* linger time */
};
有下列三种情况:
l_onoff为0,则该选项关闭,l_linger的值被忽略,等于缺省情况,close立即返回;
l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;
l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。如果套接口缓冲区中仍残留数据,进程将处于睡眠状态,直 到:(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述字访问计数为0);(b)延迟时间到。此种情况下,应用程序检查close的返回值是
非常重要的,如果在数据发送完并被确认前时间到,close将返回EWOULDBLOCK错误且套接口发送缓冲区中的任何数据都丢失。close的成功返 回仅告诉我们发送的数据(和FIN)已由对方TCP确认,它并不能告诉我们对方应用进程是否已读了数据。如果套接口设为非阻塞的,它将不等待close完成。
l_linger的单位依赖于实现,4.4BSD假设其单位是时钟滴答(百分之一秒),但Posix.1g规定单位为秒。
相关文章推荐
- 关于setImageState(int[] state, boolean merge)的解释以及使用方式
- 关于PHP的超时--set_time_limit与CURLOPT_TIMEOUT思考
- 关于set global sql_slave_skip_counter=N 命令的解释
- [Mongdb] 关于Replica Set复制集奇数成员限制的解释--待完善
- 关于思科mds交换的zone zoneset vsan的解释
- 关于Android Spinner setSelection 和 onItemSelected事件的触发顺序
- 关于MarshalByRefObject的解释
- 关于application/x-www-form-urlencoded等字符编码的解释说明
- 关于"Result set type is TYPE_FORWARD_ONLY"错误
- socket选项总结(setsocketopt)
- 关于CGContextSetBlendMode: invalid context 0x0的错误
- c++ 关于对象浅复制的一些疑问,希望懂得大虾给我解释解释~~
- 关于POJO(实体类)中数组的的set方法
- [转]关于struct的一些解释与class对比
- 关于javaBean中boolean类型变量的set和get
- C语言关于补码的解释及误区
- 关于lib,dll,.a,.so,静态库和动态库的解释说明
- opencv 中关于BOW模型的实现以及相关的函数解释
- 关于SQL Server还原错误:The backup set holds a backup of a database other than the existing database.
- Java编程语言和Java指南中关于Java的参数传递的解释