我有一个原生的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通过该工作传递数据,所以我认为它可能有几个选项:
答案 0 :(得分:1)
我发现了这个问题。
我在拥有对象的初始化函数中调用了io_service.stop(),因为它可以重新初始化。然而,在调用stop之后我没有调用io_service.reset(),并且在停止之后io_service将不会运行,直到调用reset。
RTFM中的课程,因为停止和重置都记录了这一点。
然而,boost :: system :: error_code变量没有反映出这种状态,这有点令人沮丧,因为它会让我感到烦恼。