如果我的客户端连接在另一个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");
}
答案 0 :(得分:3)
这似乎对我有用......有没有人看到任何问题?
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
}
答案 1 :(得分:1)
产生另一个不断ping服务器的线程 - 由于套接字不是活动连接,所以你可以做到最好。
答案 2 :(得分:1)
尝试检查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
方法。
来自Source:
或者,您也可以使用 Poll()Socket方法用 SelectRead SelectMode参数。这个 如果,方法将返回一个真值 数据可用或连接 已被远程主机关闭。 然后,您需要区分 这些情况之间有哪些 发生(通过阅读插座 缓冲区,看看它是否返回 零值)。
答案 3 :(得分:0)
SendTimeout
的{{1}}和/或ReadTimeout
属性是否有帮助?
答案 4 :(得分:0)
我推荐你my answer到这个问题的C ++版本......
答案 5 :(得分:-1)
您是否尝试设置较短的连接超时?