我们如何知道 StreamSocket 的状态?

How do we know a StreamSocket's state?

如何检查 SteamSocket 是否已连接?

我在官方文档和幻灯片中没有发现任何相关或有用的内容。

提前致谢

经过几个小时的谷歌搜索,我发现这不是 Poco 的问题。似乎 C 套接字本身在设计上不知道自己的状态,而 Poco 套接字基于 C 套接字,所以一切都有意义。

(没学过C/C++基础,直接用Qt编程,Qt的socket确实提供了检查连接状态的功能。由于缺乏基础C/C++知识我上面的结论可能是错误的)

用于阻塞套接字:到目前为止,我找到的唯一解决方案是使用 StreamSocket::receiveBytes(),如果对等方已使用关闭,它 returns 0 () 关闭连接,并在连接丢失或类似情况时抛出异常。

对于非阻塞套接字:完全不知道:)

检查套接字是否仍处于连接状态比一开始听起来要难得多。例如,从您的系统看来,套接字可能仍处于连接状态,但其他主机可能已崩溃。或者可能是网络有问题等等

一般来说,如果你只是想知道你是否还没有在套接字上调用 close(),你可以这样做:

bool connected = socket.impl()->initialized();

另一方面,如果您确实需要查明连接是否仍然存在,则必须向对等方发送消息并等待其响应。这是告诉连接处于活动状态的唯一可靠方法。如果您只需要查明对等方是否已关闭套接字,请尝试 poll() 短超时,然后是 receiveBytes() (如果 poll() 表明有内容可读),如果对等方已关闭连接,它将 return 0。您也可以尝试将套接字设置为非阻塞并调用 receiveBytes().

我还建议您看看 Unix Socket FAQ

在编写网络代码时,无论是 TCP 套接字还是 HTTP,或任何其他协议,我强烈建议对特定协议和机制有扎实的了解,而不是只使用高级 API 并希望为了最好。