我们如何知道 StreamSocket 的状态?
How do we know a StreamSocket's state?
如何检查SteamSocket是否已连接?
我在官方文档和幻灯片中没有发现任何相关或有用的内容。
提前感谢
检查套接字是否仍处于连接状态比最初听起来要困难得多。例如,从系统的角度来看,套接字可能仍处于连接状态,但其他主机可能已崩溃。或者网络中可能存在问题等。
一般来说,如果你只是想知道你是否还没有在套接字上调用close(),你可以这样做:
bool connected = socket.impl()->initialized();
另一方面,如果你真的需要查明一个连接是否仍然有效,你必须向对等方发送一条消息,等待它的响应。这是判断连接是否有效的唯一可靠方法。如果您只需要了解对等方是否关闭了套接字,请尝试一个具有短超时的poll()
,然后是一个receiveBytes()
(如果poll()
指示有内容要读取),如果对等方关闭了连接,它将返回0。您也可以尝试将套接字设置为非阻塞并调用receiveBytes()
。
我还建议大家看看Unix套接字常见问题解答。
在编写网络代码时,无论是TCP套接字或HTTP,还是任何其他协议,我强烈建议对特定的协议和机制有扎实的了解,而不仅仅是使用高级API并希望做到最好。
经过几个小时的谷歌搜索,我发现这不是Poco的问题。从设计上看,C套接字本身似乎不知道自己的状态,而Poco套接字是基于C套接字的,所以一切都有意义。
(我没有学习过C/C++基础知识,我直接用Qt编程,Qt的套接字确实提供了检查连接状态的功能。由于缺乏基本的C/C++知识,我上面的结论可能是错误的)
对于阻塞套接字:到目前为止,我找到的唯一解决方案是使用StreamSocket::receiveBytes(),如果对等方使用shutdown()关闭连接,则返回0,如果连接丢失或类似情况,则抛出异常。
对于非阻塞套接字:完全不知道:)
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- 我们如何知道 StreamSocket 的状态?