试验例:
即使没有数据可用,也存在连接 true
class MyConnection
{
//Assume I have all initialization for _socket
public bool IsConnected()
{
return !(_socket.Poll(1, SelectMode.SelectRead)
&& _socket.Available == 0);
}
private Socket _socket;
}
class Test
{
static void Main(string[] args)
{
MyConnection my = new MyConnection()
if(my.IsConnected())
/*always return true even when I am not connected*/;
}
}
任何想法如何预防?
到目前为止,没有一个答案是令人满意的......
可以做到以下几点:
public bool IsConnected()
{
bool bConnected = false;
bool bState = _socket.Poll(1, SelectMode.SelectRead);
try
{
if (bState && (_socket.Available == 0))
bConnected = false;
else
bConnected = true;
}
catch (SocketException)
{
//_socket.Available can throw an exception
bConnected = false;
}
return bConnected;
}
答案 0 :(得分:3)
我认为你的_socket.Poll()
电话是倒退的。如果轮询失败,那将有助于该方法评估为true而不是false。试试这个:
public bool IsConnected()
{
return !(!_socket.Poll(1, SelectMode.SelectRead)
&& _socket.Available == 0);
}
我也不确定将_socket.Available
作为此检查的一部分是个好主意。根据{{3}},返回值0只表示“没有数据在网络缓冲区中排队”。即使是连接的插座,这也很容易实现。
答案 1 :(得分:1)
我不确定您要实现的目标,但假设您试图判断连接是否已损坏,这篇文章可能会有所帮助:
How can I tell if the connection has been broken in my sockets based client?
编辑:故障排除步骤是确定两个布尔表达式中的哪一个返回false,或者它们是否都返回false。
答案 2 :(得分:0)
在我看来,您可能无法获得Socket类所期望的功能。我的理解是Socket类只知道最后一个套接字操作的连接状态。
请注意,Poll method有一些限制:
此方法无法检测某些类型的连接问题,例如网络电缆损坏,或者远程主机无法正常关闭。您必须尝试发送或接收数据以检测这些类型的错误。
这意味着如果出现非正常断开连接,套接字继续报告为真是正常的,直到后续套接字操作超时(这可以解释您在上一篇文章中遇到的几分钟延迟) )。
这意味着如果要检测非正常断开连接,则可能需要按previous answer中的建议实施应用程序级心跳/ ping。您可能需要使用ping之间的间隔,否则您将失去一定程度的容错能力,并且延迟峰值可能会导致不必要的断开连接报告。