65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 .Net Sockets 中检测连接丢失

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.26/5 (9投票s)

2004 年 10 月 17 日

2分钟阅读

viewsIcon

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 的文章,包括异步和同步套接字的使用,以及什么时候有时间发布异步调用

如何在 .Net Sockets 中检测连接丢失 - CodeProject - 代码之家
© . All rights reserved.