【发布时间】:2019-11-19 16:32:47
【问题描述】:
我有一个从客户端接收数据的服务器,我希望能够确定套接字是否仍然连接。
我正在使用以下函数来确定状态(source):
bool SocketConnected(Socket s)
{
bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 && part2)
return false;
else
return true;
}
但是,当 RTT(服务器/客户端之间)很高(~300 毫秒)并且变化(+- 60 毫秒)时,我的应用程序“崩溃”。从调试中我发现这是由于套接字被标识为未连接(SocketConnected()返回false)。不过我知道,套接字仍处于连接状态,因为我可以看到客户端流式传输从服务器请求的内容,并且服务器接收 Wireshark 捕获的数据。
我应该增加 Poll 的时间(但我不想阻止其他操作)还是将 Socket.Connected 属性与 SocketConnected() 一起使用?在 volatile 环境中确定套接字状态的最有效方法是什么?
【问题讨论】:
-
视情况而定。您应该依赖 Connected 属性。即使不是,你通常也不在乎。正常的错误处理必须注意它。调用上述方法后一毫秒可能已经断开连接,这样检查有什么意义?早点意识到?如果您的资源有限,这可能很重要。
-
@Sinatr 所以你说我应该只依赖 Connected 属性?它会做同样的工作,而不必轮询客户端并等待 1 毫秒,对吧?因为我所做的是添加另一个布尔变量并检查属性(例如 bool part3 = s.Connected; if (part1 && part2 && !part3))。资源不是问题,但如果 Connected 属性会给出相同的结果,那么我想没有理由使用 Poll,对吧?