使用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())
我有一个本地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变量没有反映这个状态,这有点令人沮丧,因为它可以节省我的时间。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 提升 ASIO 无法识别计时器对象
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 缓慢提升ASIO
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- asio::read() 需要很长时间,使用 asio::write 没有问题
- 使用 boost 的 boost::asio::read 直接写入 cout。
- boost:asio::read or boost:asio::async_read with timeout
- 为什么 read() 在管道连接到使用 boost::asio for STDIN/STDOUT 的程序时,使用 EAG
- boost::asio::read函数挂起
- boost::asio read from /dev/input/event0
- 使用boost::asio::async_read失败,但boost::asio::read工作(我使用io_strea
- 在线程中调用boost::asio::read()会阻塞调用线程或进程
- 通过连续两次调用boost::asio::read来检索正确的数据
- 自定义web服务中的Boost::asio::read()阻塞
- boost asio receive() vs read()
- boost::asio::read防止boost:asio::write向Java Socket发送数据
- 在read()之前检查boost::asio缓冲区数据是否存在