我想用 Boost Asio 做以下事情。我有一个套接字,我想注册一个回调,以便在数据可用于在套接字上读/写时调用,但我不希望它实际进行读/写。基本上,我需要的和async_read_some
/差不多async_write_some
,只是没有做实际的读写。
我需要这个,因为我正在使用一个具有自己的读写函数的外部库,该函数需要一个套接字描述符作为输入参数,并且我想以异步方式使用这个库。
我想用 Boost Asio 做以下事情。我有一个套接字,我想注册一个回调,以便在数据可用于在套接字上读/写时调用,但我不希望它实际进行读/写。基本上,我需要的和async_read_some
/差不多async_write_some
,只是没有做实际的读写。
我需要这个,因为我正在使用一个具有自己的读写函数的外部库,该函数需要一个套接字描述符作为输入参数,并且我想以异步方式使用这个库。
您正在寻找反应堆式操作。这些可以通过提供boost::asio::null_buffers
给异步操作来获得。Reactor 样式的操作可用于与第三方库集成、使用共享内存池等。Boost.Asio文档提供了一些信息和以下示例代码:
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 还提供了一个官方的非阻塞示例,说明了如何与想要直接在套接字上执行读写操作的库集成。
采用socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);