如何判断基于套接字的客户端连接是否已断开?

如果我的客户端连接在另一end( kill -9 server)断开end( kill -9 server) 。 客户端需要几分钟才能确定出现问题。 即使连接实际上已断开, Socket.Connected返回true。

一旦另一端断开链接,确定连接不存在的最快方法是什么?

客户代码:

 try{ Socket socket= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /*Assume there is a connection on the other end*/ while (socket.Connected) { /*Do some processing*/ } }catch (SocketException se){ Console.WriteLine(ex.Message); } catch (Exception ex){ Console.WriteLine(ex.Message); } finally { Console.WriteLine("something bad happen"); } 

这似乎对我有用……有没有人看到任何问题?

 public bool IsConnected { get {return !(Socket.Poll(1, SelectMode.SelectRead) && m_socket.Available ==0)} } 

也可以加入扩展方法。

 public static class SocketExtensions { public static bool IsConnected(this Socket @this) { return !(@this.Poll(1, SelectMode.SelectRead) && @this.Available == 0); } } 

现在,您可以在处理套接字的代码中轻松使用它。

 var mySocket = new Socket(); while(mySocket.IsConncted()) { // Do Stuff } 

产生另一个不断ping服务器的线程 – 由于套接字不是活动连接,所以你可以做到最好。

尝试检查Available属性,它应该在连接关闭时抛出SocketException

资源

编辑 ,以下是您将如何使用它:

 while(socket.Connected) { try { while (socket.Available == 0) System.Threading.Thread.Sleep(100); // Zzzz } catch (SocketException) { // connection closed // do something } /* Do some processing */ } 

您也可以尝试使用Poll方法。

来源 :

或者,您也可以将Poll()Socket方法与SelectRead SelectMode参数一起使用。 如果数据可用或者远程主机已关闭连接,则此方法将返回true值。 然后,您需要区分发生了哪些情况(通过读取套接字缓冲区,并查看它是否返回零值)。

也许SocketSendTimeout和/或ReadTimeout属性可以帮助?

我建议你回答这个问题的C ++版本……

您是否尝试设置较短的连接超时?