这是我的情景。在单个线程的套接字上请求几个异步写入。同一个线程调用io_service::run
。因此,我假设所有完成处理程序的执行顺序与启动相应的异步写入的顺序相同。可以在最后一个完成处理程序中关闭和关闭套接字吗?
编辑:我正在使用TCP协议。
答案 0 :(得分:3)
您需要在第一个async_write()
的完成处理程序中调用async_write()
。伪代码在
boost::asio::io_service ios;
boost::asio::ip::tcp::socket socket( ios );
void
handler2()
{
socket.shutdown( boost::asio::ip::tcp::socket::shutdown_both );
socket.close();
}
void
handler1()
{
async_write( socket, boost::bind(&handler2) );
}
int
main()
{
async_write( socket, boost::bind(&handler1) );
}
请注意,documentation明确指出可以在飞行中执行单个未完成的操作:
此操作是根据对零的或多个调用实现的 stream的
async_write_some
函数,被称为组合 操作。程序必须确保流不执行任何其他操作 写操作(例如async_write
,流的async_write_some
函数或执行写入的任何其他组合操作直到 此操作完成。
这就是为什么在单个套接字上调用多个async_write()
操作是个坏主意。或者,使用scatter operation在一个async_write()
中发送两个缓冲区。
答案 1 :(得分:0)
我假设你有一个TCP套接字(因为UDP协议是无连接的)。
如果您这样做:
start_async_write(first)
start_async_write(second) -> close socket on complete
io_service.run()
一切都会好的,你的写入将被序列化,run()
方法将在完成处理程序调用套接字的close
方法后返回。