使用boost::asio::async_read失败,但boost::asio::read工作(我使用io_strea

Using boost::asio::async_read failing but boost::asio::read works (am using io_stream.run_one())

本文关键字:read asio boost io strea async 失败 使用 工作      更新时间:2023-10-16

我有一个本地posix套接字,我正试图从使用boost::asio::async_read异步读取。但是当我这样做的时候:

// io_stream and fd are passed by reference to this function
asio::posix::stream_descriptor stream(io_stream);
stream.assign(fd);
boost::system::error_code ec;
asio::async_read(stream, buffer,
                 asio::transfer_at_least(1),
                 boost::bind(doRead,
                             asio::placeholders::error,
                             asio::placeholders::bytes_transferred));
size_t count = io_service.run_one(ec);

count变量设置为0,并且永远不会调用doRead处理程序,并且ec不包含错误。但是,如果我用同步读取替换异步读取:

size_t count = asio::read(stream, buffer,
                          asio::transfer_at_least(1));

这可以工作,并且我在count变量中获得了预期的数据量。

我的测试用例使用由"int pipe(int pipefd[2]);"创建的fd,并通过asio::async_read传递数据,所以我认为它可能是几个选项:

  • 我传递的本机描述符在某种程度上与async_read不兼容,因此它无声地失败。我试过用阻塞打开和关闭来创建它,但无济于事。
  • io_service和posix::stream_descriptor没有连接,所以io_service永远不会尝试运行读取。这可能是由于我通过引用传递io_service ?(并且在几个线程内也是如此?)

我发现问题了。

我在拥有对象的初始化函数中调用io_service.stop(),因为它可以被重新初始化。我没有调用io_service.reset()调用后停止然而,io_service不会运行后停止,直到reset已被调用。

RTFM作为停止和重置文档的一个教训。

但是boost::system::error_code变量没有反映这个状态,这有点令人沮丧,因为它可以节省我的时间。