这是我的场景。单个线程在套接字上请求多个异步写入。同一个线程调用io_service::run
. 所以我假设所有完成处理程序的执行顺序与启动相应的异步写入的顺序相同。在最后一个完成处理程序中关闭并关闭套接字是否可以?
编辑:我正在使用 TCP 协议。
这是我的场景。单个线程在套接字上请求多个异步写入。同一个线程调用io_service::run
. 所以我假设所有完成处理程序的执行顺序与启动相应的异步写入的顺序相同。在最后一个完成处理程序中关闭并关闭套接字是否可以?
编辑:我正在使用 TCP 协议。
您将希望async_write()
从 first 的完成处理程序中调用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) );
}
请注意,文档明确指出单个未完成的操作可以在进行中:
该操作是根据对流
async_write_some
函数的零次或多次调用来实现的,称为组合操作。程序必须确保流不执行其他写入操作(例如async_write
,流的async_write_some
函数,或执行写入的任何其他组合操作),直到此操作完成。
async_write()
这就是为什么在单个套接字上调用多个操作是一个坏主意的原因。或者,使用分散操作将两个缓冲区发送到一个async_write()
.
我假设你有一个 TCP 套接字(因为 UDP 协议是无连接的)。
如果你做这样的事情:
start_async_write(first)
start_async_write(second) -> close socket on complete
io_service.run()
一切都会好的,您的写入将被序列化,run()
方法将close
在完成处理程序调用套接字的方法后返回。