如何在Boost.Asio中检查socket是否关闭?

问题描述 投票:0回答:7

检查连接远程端的套接字是否已关闭的最简单方法是什么?即使在远程端关闭,

socket::is_open()
也会返回true(我正在使用
boost::asio::ip::tcp::socket
)。

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

c++ boost sockets boost-asio
7个回答
13
投票

只需检查

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


8
投票

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

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

我建议初学者使用this


7
投票

如果连接已被对等方完全关闭,您应该在读取时收到 EOF。否则,我通常会 ping 以确定连接是否确实有效。


2
投票

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


0
投票

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


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

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

使用 boost::asio 配置 TCP keep_alive


0
投票

我尝试了很多方法,但没有一个能完美工作,所以我认为这是一个糟糕的设计。 available() 不会告诉你 EOF。你必须阅读,但这意味着如果没有 EOF,你将被阻止。没有办法到达峰值检查 EOF 然后走开。

正如其他人所建议的,您也可以继续循环阅读,但这会使代码变得更加复杂,并浪费缓冲区和时间。

它不像 epoll 那样可以轻松获得中断来判断对等方是否关闭了连接。

© www.soinside.com 2019 - 2024. All rights reserved.