如何判断基于套接字的客户端连接是否已断开?
如果我的客户端连接在另一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值。 然后,您需要区分发生了哪些情况(通过读取套接字缓冲区,并查看它是否返回零值)。
也许Socket
的SendTimeout
和/或ReadTimeout
属性可以帮助?
我建议你回答这个问题的C ++版本……
您是否尝试设置较短的连接超时?