如何在关闭socket连接的时候跳过TIME_WAIT的等待状态

原因分析:

socket关闭之后并不会立即收回,而是要经历一个TIME_WAIT的阶段。windows下最多可以达到4分钟。在这个时候对这个端口进行重新绑定就会出错。

time_wait状态是一般有客户端的状态。而且会占用端口。有时产生在服务器端,因为服务器主动断开连接或者发生异常。

方式一:

设置 SO_REUSEADDR

if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	return -1;
	
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) {
	close(fd);
	return -1;
}

方式二:

在closesocket的时候,使用setsockopt设置SO_DONTLINGER。

int z; 		 /* Status code*/ 
int s;       /* Socket s */
struct linger so_linger;
...
so_linger.l_onoff = TRUE;
so_linger.l_linger = 30;   // 30秒的超时时限
z = setsockopt(s,
    SOL_SOCKET,
    SO_LINGER,
    &so_linger,
    sizeof so_linger);
if ( z )
   perror("setsockopt(2)");

这l两种方式可以跳过TIME_WAIT的阶段,客户端重启后可以快速进行连接。通常使用这个设置来加强网络程序的健壮性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TIME_WAIT是TCP协议中的一种状态,当一端关闭连接后,它会进入TIME_WAIT状态,并在一段时间内保持这个状态。在这个状态下,该端口在连接释放之后仍然不能被其他新连接使用,因为它需要等待足够长的时间来确保之前的连接已经完全关闭。 引用提到了通过设置SO_LINGER标志来避免socket进入TIME_WAIT状态。这种方法可以通过发送RST包来代替正常的TCP四次握手来终止连接。然而,这并不是一个推荐的做法,因为TIME_WAIT状态对于我们来说通常是有利的。 引用指出,CLOSE_WAIT状态是由于某一方没有正确关闭连接导致的。这种状态发生在一方网络连接断开后,并未执行closesocket操作,导致连接状态停留在CLOSE_WAIT状态。与CLOSE_WAIT相对应的是TIME_WAIT状态。 引用提到了解决大量TIME_WAIT状态连接的方法之一是通过调整内核参数。在/etc/sysctl.***的快速回收。 综上所述,TIME_WAIT是TCP协议中用于确保连接完全关闭的一种状态。虽然有一些方法可以避免进入TIME_WAIT状态,但通常来说,TIME_WAIT对于连接的正常关闭是有利的。调整内核参数也可以解决大量TIME_WAIT状态连接的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [TCP/IP的time_wait状态详解](https://blog.csdn.net/tianmo2010/article/details/7436157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [关于面试经常被问到的socketTIME_WAIT状态的原因及解决办法和避免的办法](https://blog.csdn.net/wu936754331/article/details/49104497)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值