繁体   English   中英

验证套接字是否打开的可靠方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM