【发布时间】:2019-10-21 16:16:52
【问题描述】:
我使用 boost asio 编写了一个 tcp 通信方案,如果我为 io_service::run() 使用单独的线程,它工作得很好。但是,通信器也应该用作 MPI 并行程序的一部分(请不要质疑这一点),其中分叉和线程不是一个好主意,并且可能不允许。
因此,通信器有一个函数work(),它调用io_service::run_one。现在,如果我直接使用async_read,它将阻塞对run_one 的调用,直到读取某些内容或发生错误。所以我编写了如下所示的check_available 函数,它首先检查套接字上是否有东西,然后在我的函数read_message_header 中调用async_read。
这也很顺利,直到对等方关闭连接。不幸的是,这似乎没有被socket::available(error) 标记为eof 错误,就像async_read 中的情况一样,它返回0 作为可用字节数,因此永远不会调用read_message_header,然后会检测到eof。同时检查 socket::is_open() 并不能用于此目的,因为只有对等方的套接字被关闭,而不是此实例上的接收套接字。
void TCPConnection::check_availble() {
if(! socket_.is_open()) {
handle_read_error(boost::asio::error::eof);
}
boost::system::error_code error;
size_t nbytes=socket_.available(error); // does not detect the eof
if(error)
handle_read_error(error);
if(nbytes>0)
read_message_header();
else
socket_.get_io_service().post(
boost::bind(
&TCPConnection::check_availble,
shared_from_this()
)
);
}
有没有办法在没有任何阻塞调用的情况下检测 eof?
【问题讨论】:
-
它在哪里说它应该'被
socket::available(error)标记为eof错误'?您必须执行读取以检测套接字上的 EOF。
标签: c++ sockets boost-asio eof