`

[转] setsockopt :SO_LINGER 选项设置 socket error 10055

 
阅读更多
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完成。

注释:l_linger的单位依赖于实现: 4.4BSD假设其单位是时钟滴答(百分之一秒),但Posix.1g规定单位为秒。

下面的代码是一个使用SO_LINGER选项的例子,使用30秒的超时时限:
#define TRUE     1
#define FALSE    0
int z; /* Status code
*/ int s;       /* Socket s */
struct linger so_linger;
...
so_linger.l_onoff = TRUE;
so_linger.l_linger = 30;
z = setsockopt(s,
    SOL_SOCKET,
    SO_LINGER,
    &so_linger,
    sizeof so_linger);
if ( z )
   perror("setsockopt(2)");

下面的例子显示了如何设置SO_LINGER的值来中止套接口s上的当前连接:
#define TRUE     1
#define FALSE    0
int z; /* Status code */
int s;       /* Socket s */
struct linger so_linger;
...
so_linger.l_onoff = TRUE;
so_linger.l_linger = 0;
z = setsockopt(s,
    SOL_SOCKET,
    SO_LINGER,
    &so_linger,
    sizeof so_linger);
if ( z )
    perror("setsockopt(2)");
    close(s); /* Abort connection */

在上面的这个例子中,当调用close函数时,套接口s会立即中止。中止的语义是通过将超时值设置为0来实现的。




/********** WINDOWS **********/



/* 当连接中断时,需要延迟关闭(linger)以保证所有数据都被传输,所以需要打开SO_LINGER这个选项; 
* //注:大致意思就是说SO_LINGER选项用来设置当调用closesocket时是否马上关闭socket;
* linger的结构在/usr/include/linux/socket.h中定义://注:这个结构就是SetSocketOpt中的Data的数据结构
*  struct linger
*  {
*   int l_onoff;  /* Linger active */       //低字节,0和非0,用来表示是否延时关闭socket
*   int l_linger; /* How long to linger */   //高字节,延时的时间数,单位为秒
*  };
*  如果l_onoff为0,则延迟关闭特性就被取消。

*   如果非零,则允许套接口延迟关闭; l_linger字段则指明延迟关闭的时间
*/


更具体的描述如下:
1、若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。

2、若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅”或“从容”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。

3、若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零),则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。


SO_DONTLINGER 若为真,则SO_LINGER选项被禁止。
SO_LINGER延迟关闭连接 struct linger上面这两个选项影响close行为;


     选项          间隔    关闭方式  等待关闭与否
  SO_DONTLINGER   不关心     优雅         否
  SO_LINGER        零        强制         否
  SO_LINGER       非零       优雅         是

[转] http://blog.csdn.net/factor2000/article/details/3929816
http://kbase.pscs.co.uk/index.php?article=93
http://support.microsoft.com/kb/196271

另外附上另外一个讲解的比较详细的博客链接: 如何解决TIME_WAIT过多的解决办法(附Socket中的TIME_WAIT状态详解)
http://hi.baidu.com/xzhijun/item/4681b655ed3a2811da1635f1

还有就是修改注册表的方式来执行,详细请看列表:
http://baowand6203.blog.163.com/blog/static/1710319642011926113047543/



花下眠工作室: http://huaxiamian.cc
分享到:
评论

相关推荐

    解决重启main提示端口被占用问题.setsockopt :SO_LINGER 选项设置 - hongzi的专栏 - 博客频道

    标题中的“解决重启main提示端口被占用问题”和描述中的“setsockopt:SO_LINGER选项设置”都指向了一个常见的网络编程问题,即在关闭TCP连接时如何处理未发送的数据和端口占用的问题。`setsockopt`是Unix-like操作...

    setsockopt 设置socket 详细用法.doc

    当在`closesocket()`调用前仍有数据未发送完成,可以设置`SO_LINGER`选项,允许socket在关闭前等待一定时间以发送剩余数据。这提供了比立即关闭更优雅的退出机制。 ```c struct linger { u_short l_onoff; u_...

    setsockopt()设置socket方法

    在发送数据的过程中,如果调用 closesocket(),而数据还没有发送完毕,可以使用 setsockopt() 函数设置 LINGER 选项。例如: linger m_sLinger; m_sLinger.l_onoff=1; m_sLinger.l_linger=5; setsockopt(s,SOL_...

    setsockopt参数详解

    setsockopt 函数是 socket 编程中一个非常重要的函数,它允许开发者控制套接字的行为,修改缓冲区的大小,设置套接字选项等。该函数的参数众多,理解每个参数的作用对于正确使用该函数非常重要。 level 参数 level...

    setsockopt

    setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (const char *)&m_sLinger, sizeof(struct linger)); ``` 9. **调试模式(SO_DEBUG)** 开启调试模式可以记录套接字的相关信息,这对于开发阶段非常有用: ```c ...

    Linux下socket设置[借鉴].pdf

    如果希望在关闭socket后立即重用该套接字,可以使用`setsockopt()`函数,设置`SO_REUSEADDR`选项,如下所示: ```c BOOL bReuseaddr = TRUE; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, ...

    socket的属性设置测试代码

    `getsockopt`和`setsockopt`函数是Socket API中的关键成员,它们允许程序员获取或设置Socket的特定选项。这两个函数的原型大致如下: ```c int getsockopt(int socket_fd, int level, int optname, void *optval, ...

    setsockopt()改善程序的健壮性

    setsockopt(s, SOL_SOCKET, SO_LINGER, (const char*)&m_sLinger, sizeof(linger)); ``` 这种方式提供了更多的灵活性来控制关闭过程中的行为。 #### 10. 开启调试模式 为了方便调试,可以开启`SO_DEBUG`选项: `...

    socket_recv函数使用心得.

    * SO_ERROR:套接字上发生了异步错误,系统将设置套接字的SO_ERROR,getsockopt 调用后 so_error 的值将自动初始化。 在使用 socket 函数时,需要了解多路复用 select() 函数的使用。select() 函数可以监视多个套接...

    Socket选项设置含义[归类].pdf

    2. **参数level**:指定选项所在的层次,通常设置为`SOL_SOCKET`以在套接字级别设置选项,或者设置为特定的协议层(如IPPROTO_TCP用于TCP选项)。 3. **参数option_name**:表示我们要设置的具体选项,如SO_DEBUG、...

    Linux下socket设置.pdf

    9. **linger选项(SO_LINGER)**:在需要确保发送完所有数据后再关闭Socket的情况下,可以设置`SO_LINGER`。设置`l_onoff`为1启用linger,并设置`l_linger`为一个适当的秒数,例如5秒,这样即使在`closesocket`时仍...

    linux 网络编程 socket选项的实现

    Socket选项表中包含多种选项,如`SO_DEBUG`、`SO_DONTROUTE`、`SO_KEEPALIVE`、`SO_LINGER`、`SO_OOBINLINE`、`SO_RCVBUF`、`SO_RCVLOWAT`、`SO_SNDBUF`、`SO_SNDLOWAT`、`TCP_MAXSEG`和`TCP_NODELAY`等。这些选项在...

    setsockopt函数使用说明

    `setsockopt`函数是计算机网络编程中的一个重要组成部分,主要用于设置套接字选项,它允许程序在套接字层上设置各种参数,以控制网络通信的行为。这个函数在跨平台的Socket API中广泛使用,适用于多种操作系统,如...

    socket选项说明

    - **SO_ERROR**:获取Socket的错误状态。 - **TCP层面的SO_NODELAY**:禁用Nagle算法,减少数据包的延迟,但可能增加网络流量。 #### 示例代码解析 在给定的部分内容中,示例代码展示了如何使用 `getsockopt()` 来...

    setsockopt函数一片不错的文章

    `setsockopt`函数是Socket编程中的一个重要工具,用于设置套接字选项,影响Socket的行为和性能。以下将详细解释在给定的文件中提到的各个知识点: 1. **重用已关闭的Socket**: 当调用`closesocket`后,Socket通常...

    SO_REUSEADDR配置 & TCP_NODELAY1

    在编程中,可以使用setsockopt函数来设置SO_REUSEADDR选项,例如: ```c int opt = TRUE; setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)); ``` 这样,主机A在断开连接后,可以重新...

    setsockopt()教程_棒.zip socket

    setsockopt()教程_棒.zip

    liunx课件关于shell

    - `SO_ERROR`:获取套接字错误状态。 - `SO_KEEPALIVE`:保持连接活动。 - `SO_LINGER`:设置连接关闭时的延迟时间。 - `SO_OOBINLINE`:将带外数据合并到正常数据流中。 - `SO_RCVBUF`和`SO_SNDBUF`:分别设置接收...

    socket setsocketopt函数的使用示例

    `setsockopt`函数在socket编程中扮演着重要角色,它允许我们对socket进行各种配置,如设置超时、启用禁用套接字选项等。本文将深入探讨`setsockopt`函数的使用,并结合给出的示例代码进行讲解。 `setsockopt`函数的...

Global site tag (gtag.js) - Google Analytics