[英]My IsConnected always returns true
测试用例:
即使没有数据可用,也存在连接返回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;
}
我认为你的_socket.Poll()
调用是倒退的。 如果轮询失败,那将有助于该方法评估为true而不是false。 尝试这个:
public bool IsConnected()
{
return !(!_socket.Poll(1, SelectMode.SelectRead)
&& _socket.Available == 0);
}
我也不确定将_socket.Available
作为此检查的一部分是个好主意。 根据文档 ,返回值0只表示“没有数据在网络缓冲区中排队”。 即使是连接的插座,这也很容易实现。
我不确定你想要实现的目标,但假设你试图判断连接是否已被破坏,这篇文章可能会有所帮助:
编辑:故障排除步骤是确定两个布尔表达式中的哪一个返回false,或者它们是否都返回false。
在我看来,你可能无法获得你期望从Socket类中获得的功能。 我的理解是Socket类只知道最后一个套接字操作的连接状态。
请注意, Poll方法有一些限制:
此方法无法检测某些类型的连接问题,例如网络电缆损坏,或者远程主机无法正常关闭。 您必须尝试发送或接收数据以检测这些类型的错误。
这意味着如果出现非正常的断开连接,套接字继续报告为真,直到后续套接字操作超时(这可以解释您在之前的帖子中经历的几分钟延迟)是正常的。
这意味着如果要检测不合适的断开连接,您可能需要实现应用程序级心跳/ ping,如上一个答案中所述 。 您可能需要使用ping之间的间隔,否则您将失去一定程度的容错能力,并且延迟峰值可能会导致不需要的断开连接报告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.