我们如何知道StreamSocket的状态?

时间:2019-01-20 22:33:47

标签: c++ poco-libraries

如何检查SteamSocket是否已连接?

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

预先感谢

2 个答案:

答案 0 :(得分:0)

经过几个小时的搜索后,我发现这不是Poco的问题。似乎在设计上C套接字本身并不了解自己的状态,而Poco套接字基于C套接字,因此一切都说得通。

(我还没有学过C / C ++基础知识,我直接用Qt进行编程,其套接字确实提供了检查连接状态的功能。由于缺乏基本的C / C ++知识,我的上述结论可能是错误的< / strong>)

用于阻塞套接字:到目前为止,我发现的唯一解决方案是使用StreamSocket :: receiveBytes(),如果对等方使用shutdown()关闭了连接,它将返回0,并引发异常如果连接断开或类似现象。

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

答案 1 :(得分:0)

检查套接字是否仍比最初听起来困难得多。例如,从系统的角度来看,套接字可能仍已连接,但其他主机可能已崩溃。或网络中可能有问题等。

通常,如果您只想知道是否尚未在套接字上调用close(),则可以执行以下操作:

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

另一方面,如果您真的需要确定连接是否仍然存在,则必须向对等方发送一条消息,并等待其响应。这是告诉连接仍然有效的唯一可靠方法。如果您只需要找出对等端是否已关闭套接字,请尝试在短时间内尝试poll(),然后再尝试receiveBytes()(如果poll()表示有需要阅读的内容),如果对等方已关闭连接,它将返回0。您也可以尝试将套接字设置为非阻塞并调用receiveBytes()

我还建议您看看Unix Socket FAQ

在编写网络代码(无论是TCP套接字还是HTTP或任何其他协议)时,我强烈建议您对特定的协议和机制有扎实的知识,而不仅仅是使用高级API并希望达到最佳效果。