这通常被称为反应器式操作。
通过向异步操作提供
boost::asio::null_buffers
,可以获得这些操作。 反应器式操作提供了一种在可以执行读取或写入操作时被通知的方式,并且可用于与第三方库集成,使用共享内存池等。 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还提供了一个官方的
非阻塞示例,演示如何与希望直接在套接字上执行读写操作的库集成。
提供一个零长度的缓冲区给操作通常会导致无操作,因为操作的完成条件已经满足而没有尝试执行任何I/O。这里是一个完整的示例
demonstrating,演示了两者之间的差异:
#include <array>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
void noop() {}
void print_status(
const boost::system::error_code& error,
std::size_t bytes_transferred,
boost::asio::ip::tcp::socket& socket)
{
std::cout << "error: " << error.message() << "; "
"transferred: " << bytes_transferred << "; "
"available: " << socket.available() << std::endl;
}
int main()
{
using boost::asio::ip::tcp;
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 0));
tcp::socket socket1(io_service);
tcp::socket socket2(io_service);
acceptor.async_accept(socket1, boost::bind(&noop));
socket2.async_connect(acceptor.local_endpoint(), boost::bind(&noop));
io_service.run();
io_service.reset();
std::array<char, 512> buffer;
socket1.async_receive(boost::asio::buffer(buffer, 0),
boost::bind(&print_status,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
boost::ref(socket1))
);
assert(1 == io_service.poll());
io_service.reset();
socket1.async_receive(boost::asio::null_buffers(),
boost::bind(&print_status,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
boost::ref(socket1))
);
assert(0 == io_service.poll());
boost::asio::write(socket2, boost::asio::buffer("hello"));
assert(1 == io_service.poll());
}
输出:
error: Success; transferred: 0; available: 0
error: Success; transferred: 0; available: 6
null_buffers
已被弃用:"(已弃用: 使用套接字/描述符的wait()和async_wait()成员函数。)" - sehe