如何检测TCP套接字的断开状态

时间:2017-11-08 11:07:19

标签: c# sockets tcp

我目前正在开展一个项目,我需要通过GPRS从设备接收数据。这些设备将数据发送到侦听服务器端口的TCP服务器。我首先遇到连接多个设备的问题,经过一些研究后我了解到我应该实现异步方法。我现在有1个TCP套接字侦听传入连接,并且一旦请求进入,就会将其置于新的套接字连接中,释放侦听套接字以进行其他连接尝试。

我的挑战:我正在使用2台设备进行测试,这些设备连接成功,可以发送数据。当我关闭设备(取出电池和SIM卡)时,我无法检测到此设备不再连接并关闭插座。在侦听器的端口上运行netstat时,我仍然看到2个连接“ESTABLISHED”的设备。

我尝试了各种示例,但各种套接字轮询选项都返回'true'。现在唯一可行的选择是尝试向套接字发送一些数据,这些数据将失败并被捕获,然后返回false值。在套接字上设置ReceiveTimeout属性也没有帮助。 我试过了:

socket.Poll(1000, SelectMode.SelectWrite); //returns true
socket.Poll(1000, SelectMode.SelectRead); //returns true
socket.Available = 0 (available);

1 个答案:

答案 0 :(得分:0)

使用

之类的代码
 'if(socket.Connected) { socket.Write(...) }

创造竞争条件。你最好只是调用socket.Write并处理异常和/或断开连接。

套接字层应使用异常进行管理。抛出的IOException将内部异常设置为SocketException,其中包含远程检测超时或关闭套接字所需的所有信息