当前位置:  技术问答>linux和unix

设置so_linger不起作用?

    来源: 互联网  发布时间:2016-06-23

    本文导语:  阻塞socket编程。一个server,一个client。 流程如下: server: 1) bind    listen    accept    sleep(60) client    设置so_linger    connect    send 5k数据    close. 我的理解,由于server accept后,进行了sleep,没有接收数据。...

阻塞socket编程。一个server,一个client。
流程如下:
server:
1) bind
   listen
   accept
   sleep(60)

client
   设置so_linger
   connect
   send 5k数据
   close.

我的理解,由于server accept后,进行了sleep,没有接收数据。所以当client调用close时,理论上应该阻塞close一段时间。但是程序调试,发现close直接返回,没有阻塞。

why,so_linger作用不就是需要发送完缓冲data,才能close连接的吗

client code如下:

    struct sockaddr_in client_addr;
    struct linger my_lin;
    char buftmp[1024*10];

    init_transfer();

    len = sizeof(struct sockaddr_in);
    memset(&client_addr, 0, len);

    client_addr.sin_family      = AF_INET;
    client_addr.sin_port        = htons(TRANSFER_PORT);
    client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

            my_lin.l_onoff = 1;
            my_lin.l_linger = 60;
            if (setsockopt(transfer_sock, SOL_SOCKET, SO_LINGER, (char *)&my_lin, sizeof(my_lin)) == -1)
            {
                perror("Set socker opt failed");
                return -1;
            }

    s = connect(transfer_sock, (struct sockaddr *)&client_addr, len);

  ....

结束的地方:
    time(&stime);
    tt = close(transfer_sock);
    time(&etime);
    printf("close return %d -------------wait time %dn", tt, (int)(etime - stime));


|
setsockopt :SO_LINGER 选项设置

 此选项指定函数close对面向连接的协议如何操作(如TCP)。内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。
 
SO_LINGER选项用来改变此缺省设置。使用如下结构:
struct linger {
     int l_onoff; /* 0 = off, nozero = on */
     int l_linger; /* linger time */
};
 
有下列三种情况:
1、设置 l_onoff为0,则该选项关闭,l_linger的值被忽略,等于内核缺省情况,close调用会立即返回给调用者,如果可能将会传输任何未发送的数据;
 
2、设置 l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;
 
3、设置 l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。如果套接口缓冲区中仍残留数据,进程将处于睡眠状态,直 到(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述字访问计数为0)或(b)延迟时间到。此种情况下,应用程序检查close的返回值是非常重要的,如果在数据发送完并被确认前时间到,close将返回EWOULDBLOCK错误且套接口发送缓冲区中的任何数据都丢失。close的成功返回仅告诉我们发送的数据(和FIN)已由对方TCP确认,它并不能告诉我们对方应用进程是否已读了数据。如果套接口设为非阻塞的,它将不等待close完成。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Bitsets 成员 count():返回被设置的位的个数
  • 在使用gcc之前,需要先设置环境吗?如何设置?在线等!!!
  • C++ I/O 成员 precision():设置精度
  • 用grub能否设置启动密码?如何设置?
  • C++ Bitsets 成员 any():如果有任何一个位被设置就返回true
  • 在linux服务器上面设置squid后怎么设置可以使客户端能使用QQ?
  • C++ Double Ended Queues(双向队列) 成员 assign():设置双向队列的值
  • 请问设置一个和root权限差不多的用户怎么设置?
  • C++ Vectors 成员 reserve():设置Vector最小的元素容纳数量
  • 用JSP。XML开发网站。请问那种环境设置最好。该如何设置环境
  • C++ Bitsets 成员 set():设置位
  • 环境变量设置设置与显示不一致
  • C++ Bitsets 成员 none():如果没有位被设置则返回true
  • linux下到底如何设置环境变量?在哪设置?详细具体点
  • C++ Strings(字符串) 成员 resize():重新设置字符串的大小
  • 紧急求救各位了:linux下有没有有设置报文最小长度的命令(好像只有设置报文最大长度MTU,通过ifconfig)?
  • Windows7自带防火墙设置:启动,关闭及高级设置
  • 怎么设置在Linux上面设置WEB服务器?请各位高手指教!!!
  • C++ Strings(字符串) 成员 reserve():保留一定容量以容纳字符串(设置capacity值)
  • linux中端口号设置是在哪个配置文件,该如何设置?
  • C++ I/O 成员 setf():设置格式标志
  • 100求救 jrun3.0 里的beans的设置,你登陆我的机器设置


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3