如何在Boost.Asio中检查套接字是否已关闭?

时间:2009-05-04 03:05:54

标签: c++ boost sockets boost-asio

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

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

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

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

在快速浏览asio文档之后,我无法找到我期待的确切内容,但这并不意味着它不存在。

我建议初学者this

答案 2 :(得分:6)

如果同伴干净地关闭了连接,您应该在阅读时获得EOF。否则我通常会ping,以确定连接是否真的存在。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

boost::asio::socket_base::keep_alive keepAlive(true);
peerSocket->set_option(keepAlive);

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

Configuring TCP keep_alive with boost::asio