[英]What's a reliable way to verify that a socket is open?
我正在开发一个 C# 应用程序,使用 TCP sockets。
在调试时,我得到了这段源代码:
if ((_socket!= null) && (_socket.Connected))
{
Debug.WriteLine($"..."); <= my breakpoint is here.
return true;
}
在我的监视窗口中, _socket.RemoteEndPoint
的值为:
_socket.RemoteEndPoint {10.1.0.160:50001} System.Net.EndPoint {...}
尽管如此,在命令行中,当我运行netstat -aon | findstr /I "10.1.0.160"
netstat -aon | findstr /I "10.1.0.160"
,我只看到这个:
TCP 10.1.13.200:62720 10.1.0.160:3389 ESTABLISHED 78792
TCP 10.1.13.200:63264 10.1.0.160:445 ESTABLISHED 4
=> 远程端点“10.1.0.160:50001”在netstat
结果中不可见。
由于netstat
似乎无法可靠地测试 TCP sockets,我可以使用什么工具代替?
(供您参考:即使在进一步运行之后,仍然没有 .netstat" 条目。)
Socket.Connected的文档说:
Connected 属性的值反映了最近操作时连接的 state。 如果您需要确定连接的当前 state,请进行非阻塞的零字节发送调用。 如果调用成功返回或抛出 WAEWOULDBLOCK 错误代码(10035),则套接字仍处于连接状态; 否则,套接字不再连接。
因此,如果它返回 true - socket 在过去的某个时间已经“连接”,但现在还没有必要。
那是因为如果你的 TCP 连接还没有以某种方式联系另一端,肯定是不可能检测到的。 TCP 连接有点“虚拟”,双方只是交换数据包,但它们之间没有硬链接。 当一方决定完成通信时 - 它发送一个数据包并等待另一方的响应。 如果一切顺利,双方都会同意关闭连接。
但是,如果 A 方不发送此关闭数据包,例如因为它崩溃或 inte.net 死了等等 - 另一方 B 无法确定连接不再处于活动状态,直到它尝试发送一些数据到 A。然后这个发送将失败,现在 B 知道连接已经死了。
所以如果你真的需要知道另一边是否还活着——那么你必须向那里发送一些数据。 您可以使用在 TCP sockets 上可用的 keepalive(基本上做同样的事情 - 不时发送一些数据)。 或者如果你总是先写这个连接(比如另一端是服务器并且你不时向它发出请求,但不要期望这些请求之间有任何数据) - 那么就不要检查另一端是否还活着 -您会知道下次尝试写作的时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.