9

检查连接的远程端是否关闭了套接字的最简单方法是什么?socket::is_open()即使它在远程端关闭(我正在使用boost::asio::ip::tcp::socket)也返回 true。

我可以尝试从流中读取并查看它是否成功,但我必须更改程序的逻辑以使其以这种方式工作(我不希望在检查时从流中提取数据)。

4

6 回答 6

12

只需检查处理程序中的boost::asio::error::eof错误async_receive。这意味着连接已关闭。这是做到这一点的唯一正确方法。

于 2012-09-18T23:09:43.010 回答
8

是否有可用的增强窥视功能?大多数套接字实现都有一种读取数据的方法,而无需将其从队列中删除,因此您可以稍后再次读取它。这似乎可以满足您的要求。

在快速浏览了 asio 文档后,我无法准确找到我所期望的,但这并不意味着它不存在。

我建议初学者这样做。

于 2009-05-04T13:26:21.117 回答
7

如果连接已被对等方彻底关闭,您应该在阅读时获得 EOF。否则,我通常会 ping 以确定连接是否真的存在。

于 2009-05-04T10:01:13.153 回答
2

我认为一般来说,一旦你打开一个套接字,你应该立即开始阅读它,并且永远不要停止这样做。通过这种方式,您可以使您的服务器或客户端同时支持同步和异步协议。客户端关闭连接的那一刻,读取将告诉您这一点。

于 2009-05-09T23:06:10.093 回答
0

使用 error_code 可以检查客户端是否连接的条件。如果连接成功,error_code error.value() 将返回 0,否则返回其他值。您还可以检查 error_code 中的 message()。

于 2009-05-24T12:03:04.387 回答
0
boost::asio::socket_base::keep_alive keepAlive(true);
peerSocket->set_option(keepAlive);

为对等套接字启用保持活动。使用本机套接字来调整保活间隔,以便在连接关闭后,async_receive 处理程序将在读取时获得 EOF。

使用 boost::asio 配置 TCP keep_alive

于 2020-04-01T18:27:38.887 回答