eVC嵌入式Windows MobileVisual C++ 7.1Visual C++ 8.0Windows VistaVisual C++ 7.0C++/CLIWindows 2003移动应用C中级开发Visual StudioWindowsC++.NETVisual BasicASP.NETC#
如何在 .Net Sockets 中检测连接丢失






1.26/5 (9投票s)
2004 年 10 月 17 日
2分钟阅读

84575
解释了如何检测远程对等方何时关闭连接。
引言
检测连接关闭是处理套接字的重要部分,本文不是最复杂的,但它阐明了一些我不得不查找大量资料才能找到的信息。
对我来说,问题是 (:] ) 如何检测到对端关闭 Socket 连接。 这就是所有解决方案。
我在哪里找到的解决方案
我必须声明,我对此进行了大量研究,得到它真的让我感觉很好。 因为我在网上到处寻找答案,最后在新手的常见问题解答中找到了答案
http://tangentsoft.net/wskfaq/newbie.html
它实际上非常简单。(其中有很多其他重要信息。)
解决方案
我将引用文章
“对于异步套接字,当连接断开时,Winsock 会向您发送 FD_CLOSE 消息。事件对象类似:系统会使用 FD_CLOSE 通知来发出事件对象信号。
对于阻塞和非阻塞套接字,您可能有一个循环,在该套接字上调用 recv()。 当远程对等方关闭连接时,recv() 返回 0。 正如您所期望的那样,如果您使用的是 select(),则当连接断开时,read_fds 参数中的 SOCKET 描述符将被设置。 像往常一样,您将调用 recv() 并看到返回值 0。”
我将提供一小段 vb.net 代码来演示
注意:这适用于使用同步套接字
Try
Dim ReceivedBytes As Integer
Dim tmpBuffer As Byte()
ReDim tmpBuffer(1024)
While blActive And Socket.Connected
' Resetting received bytes
tmpBuffer.Clear(tmpBuffer, 0, tmpBuffer.Length)
' Getting new bytes
ReceivedBytes = Socket.Receive(tmpBuffer, 0, tmpBuffer.Length, Sockets.SocketFlags.None)
' Note: monitoring the blActive member as socket might have been closed prior the this point
If ReceivedBytes > 0 And blActive Then
' Your code here to handle the new data
DataReceived_Handler(tmpBuffer) ' <- Your handler
Else
' if returned with 0 bytes, that means the connection is lost
' Use your personalized code to handle the closure of the connection
yourCloseSocket() ' close the connection
End If
End While
(Fade) 注意:这仅检测到您的对等方可通知的连接关闭,如果发生不可预测的断开连接(某个偏远地区的路由器被炸成碎片),则双方可能不会收到断开连接的通知,因此请务必发送“Keep-Alive”数据包(您自己的 - 不是嵌入到 TCP 协议中的那些!)以监视您的连接运行状况。
此处提供的一些知识和代码源于我在 ActiveRoom 上开发的 Digital Signage 系统 TVM 中的工作。
只是想分享这些信息,
我一定会发布一篇更全面的关于 .Net.Sockets 的文章,包括异步和同步套接字的使用,以及什么时候有时间发布异步调用