使用boost :: asio :: async_read失败但boost :: asio :: read工作(使用io_stream.run_one())

时间:2011-12-09 06:29:18

标签: c++ boost boost-asio

我有一个原生的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));

这有效,我在计数变量中得到了预期的数据量。

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

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

1 个答案:

答案 0 :(得分:1)

我发现了这个问题。

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

RTFM中的课程,因为停止和重置都记录了这一点。

然而,boost :: system :: error_code变量没有反映出这种状态,这有点令人沮丧,因为它会让我感到烦恼。