【问题标题】:Asynchronously waiting until a socket is available for reading/writing in Asio异步等待直到一个套接字可用于在 Asio 中读取/写入
【发布时间】:2013-06-28 12:02:05
【问题描述】:

我想用 Boost Asio 做以下事情。我有一个套接字,我想注册一个回调,以便在数据可用于在套接字上读/写时调用,但我不希望它实际进行读/写。基本上我需要的和async_read_some/async_write_some差不多,只是没有做实际的读写。

我需要这个,因为我正在使用一个具有自己的读写函数的外部库,该函数需要一个套接字描述符作为输入参数,并且我想以异步方式使用这个库。

【问题讨论】:

  • 你想要使用async_connect、async_write、async_read的代码吗?
  • 只有 async_read 和 async_write。我可以自己进行连接,因为库使用来自已建立连接的套接字,所以我可以自己使用 async_connect。

标签: c++ boost boost-asio


【解决方案1】:

您正在寻找反应堆式操作。这些可以通过向异步操作提供boost::asio::null_buffers 来获得。 Reactor 样式的操作可用于与第三方库集成、使用共享内存池等。Boost.Asio documentation 提供了一些信息和以下示例代码:

ip::tcp::socket socket(my_io_service);
...
socket.non_blocking(true);
...
socket.async_read_some(null_buffers(), read_handler);
...
void read_handler(boost::system::error_code ec)
{
  if (!ec)
  {
    std::vector<char> buf(socket.available());
    socket.read_some(buffer(buf));
  }
}

Boost.Asio 还提供了官方的nonblocking example,说明了如何与想要直接在套接字上执行读写操作的库集成。

【讨论】:

【解决方案2】:

使用socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多