Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::asio::async\u读取失败,但boost::asio::read起作用(我使用io\u stream.run\u one())_C++_Boost_Boost Asio - Fatal编程技术网

C++ 使用boost::asio::async\u读取失败,但boost::asio::read起作用(我使用io\u stream.run\u one())

C++ 使用boost::asio::async\u读取失败,但boost::asio::read起作用(我使用io\u stream.run\u one()),c++,boost,boost-asio,C++,Boost,Boost Asio,我有一个本机posix套接字,我正在尝试使用boost::asio::async\u 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,

我有一个本机posix套接字,我正在尝试使用boost::asio::async\u 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,并通过该fd传递数据,这与asio::async_read配合得很好,因此我认为可能有两个选项:

  • 我传递的本机描述符在某种程度上与async_read不兼容,因此它会以静默方式失败。我尝试过用阻塞开关来创建它,但没有效果
  • io_服务和posix::stream_描述符之间没有连接,因此io_服务从不尝试运行读取。这可能是因为我通过引用传递io_服务吗?(就这一点而言,在几个线程内也是如此?)
    • 我发现了这个问题

      我在拥有对象的初始化函数中调用io_service.stop(),因为它可以重新初始化。我没有在调用stop之后调用io_service.reset(),但是在调用reset之前,io_服务不会在停止之后运行

      RTFM中的一个教训是停止和重置本文档


      然而,boost::system::error\u code变量没有反映这种状态,这有点令人沮丧,因为它可以避免我的混乱。

      a
      stream\u描述符
      管道
      读取端的描述符配合使用效果很好,请参见答案。我怀疑你的第二颗子弹是你看到的行为的原因。请编辑您的问题,并包括一个供我们分析的问题。我将在周一的工作中收集一个问题,因为我家里没有代码,谢谢!