TCP客户端断开连接后,服务器连接处于CLOSE_WAIT状态之解决办法

在TCP服务器开发中,遇到客户端关闭连接后,服务器连接处于CLOSE_WAIT状态的问题。通过非阻塞的Send调用来检查连接状态并不准确。文中介绍了通过调整TCP Keep-Alive机制来缩短检测时间,实现对客户端断开连接的及时响应,从而解决CLOSE_WAIT状态问题。通过Socket.IOControl方法设置低级操作模式,确保连接在更短的时间内被断开。
摘要由CSDN通过智能技术生成

问题背景:

        最近做C/S结构的程序,项目中需要开发TCP服务器端,需要能够接收多个客户端的连接请求。开发完成后,测试过程中出现了如题问题。

 问题描述:

        启动服务器,开启多个客户端,建立连接通讯,一切正常。关闭客户端(一个或多个),此时用netstat命令查看网络状态,发现所关闭的客户端的连接没有完全释放,而是处于CLOSE_WAIT状态。

解决方法:

        MSDN中获取当前的连接状态的说明如下:
        Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
        
经测试测方法并不能准确的获取到当前连接的状态。(环境:windows xp sp3,.Net framework 3.5)。测试发现每次关闭客户端后异步接受的返回值都零字节(我使用的是异步接收数据),因此就依据这一条件判断连接是否断开,即接收的字节为零则断开连接。经过测试此种方式确实可以对客户程序的退出作出及时的响应,本以为问题到此已经解决了,但是对另一种客户端断开方式——网线断开,还是不能及时地作出响应。搜索相关问题,找到参考文章(

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值