zoukankan      html  css  js  c++  java
  • SO_LINGER

    SO_LINGER

      在默认情况下,当调用close关闭socket的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然后close才返回.

      SO_LINGER选项则是用来修改这种默认操作的.于SO_LINGER相关联的一个结构体如下:

    1. #include <sys/socket.h>  
    2. struct linger {  
    3.       int l_onoff  //0=off, nonzero=on(开关)  
    4.       int l_linger //linger time(延迟时间)  
    5. }  

    当调用setsockopt之后,该选项产生的影响取决于linger结构体中 l_onoff和l_linger的值:

      0 = l_onoff

    当l_onoff被设置为0的时候,将会关闭SO_LINGER选项,即TCP或则SCTP保持默认操作:close立即返回.l_linger值被忽略.

      l_lineoff值非0,0 = l_linger

    当调用close的时候,TCP连接会立即断开.send buffer中未被发送的数据将被丢弃,并向对方发送一个RST信息.值得注意的是,由于这种方式,是非正常的4中握手方式结束TCP链接,所以,TCP连接将不会进入TIME_WAIT状态,这样会导致新建立的可能和就连接的数据造成混乱。具体原因详见我的上一篇文章《linux 网络编程之TIME_WAIT状态》

    • l_onoff和l_linger都是非0

      在这种情况下,回事的close返回得到延迟。调用close去关闭socket的时候,内核将会延迟。也就是说,如果send buffer中还有数据尚未发送,该进程将会被休眠直到一下任何一种情况发生:

    1)    send buffer中的所有数据都被发送并且得到对方TCP的应答消息(这种应答并不是意味着对方应用程序已经接收到数据,在后面shutdown将会具体讲道)
    2)    延迟时间消耗完。在延迟时间被消耗完之后,send buffer中的所有数据都将会被丢弃。

    上面1),2)两种情况中,如果socket被设置为O_NONBLOCK状态,程序将不会等待close返回,send buffer中的所有数据都将会被丢弃。所以,需要我们判断close的返回值。在send buffer中的所有数据都被发送之前并且延迟时间没有消耗完,close返回的话,close将会返回一个EWOULDBLOCK的error.

    参考:http://blog.csdn.net/feiyinzilgd/article/details/5894300

  • 相关阅读:
    使用 Windows XP 的两种强大的工具在您的代码中检测并堵塞 GDI 泄漏
    SystemParametersInfo
    SQL bcp命令详解
    不同版本操作系统和数据库的之间链接,和操作
    js添加删除行和双击变文本框
    MYSQL 日志问题
    循环文件夹下的文件
    php导出数据到EXCEL
    配置Apache服务器的二级域名支持
    每天读一遍,坚持30天,和老外交流没问题!
  • 原文地址:https://www.cnblogs.com/tekkaman/p/4849722.html
Copyright © 2011-2022 走看看