检查连接的远程端是否关闭了套接字的最简单方法是什么?socket::is_open()
即使它在远程端关闭(我正在使用boost::asio::ip::tcp::socket
)也返回 true。
我可以尝试从流中读取并查看它是否成功,但我必须更改程序的逻辑以使其以这种方式工作(我不希望在检查时从流中提取数据)。
检查连接的远程端是否关闭了套接字的最简单方法是什么?socket::is_open()
即使它在远程端关闭(我正在使用boost::asio::ip::tcp::socket
)也返回 true。
我可以尝试从流中读取并查看它是否成功,但我必须更改程序的逻辑以使其以这种方式工作(我不希望在检查时从流中提取数据)。
只需检查处理程序中的boost::asio::error::eof
错误async_receive
。这意味着连接已关闭。这是做到这一点的唯一正确方法。
是否有可用的增强窥视功能?大多数套接字实现都有一种读取数据的方法,而无需将其从队列中删除,因此您可以稍后再次读取它。这似乎可以满足您的要求。
在快速浏览了 asio 文档后,我无法准确找到我所期望的,但这并不意味着它不存在。
我建议初学者这样做。
如果连接已被对等方彻底关闭,您应该在阅读时获得 EOF。否则,我通常会 ping 以确定连接是否真的存在。
我认为一般来说,一旦你打开一个套接字,你应该立即开始阅读它,并且永远不要停止这样做。通过这种方式,您可以使您的服务器或客户端同时支持同步和异步协议。客户端关闭连接的那一刻,读取将告诉您这一点。
使用 error_code 可以检查客户端是否连接的条件。如果连接成功,error_code error.value() 将返回 0,否则返回其他值。您还可以检查 error_code 中的 message()。
boost::asio::socket_base::keep_alive keepAlive(true);
peerSocket->set_option(keepAlive);
为对等套接字启用保持活动。使用本机套接字来调整保活间隔,以便在连接关闭后,async_receive 处理程序将在读取时获得 EOF。