如何异步关闭套接字

How to close socket asynchronously

本文关键字:套接字 异步 何异步      更新时间:2023-10-16

这是我的场景。从单个线程请求对套接字进行多个异步写操作。同一个线程调用io_service::run。因此,我假设所有完成处理程序的执行顺序与启动相应的异步写的顺序相同。在最后一个完成处理程序中关闭和关闭套接字是可以的吗?

编辑:我使用TCP协议

您将希望在第一个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) );
}

请注意,文档明确地指出一个未完成的操作可以在飞行中:

此操作通过零或多个调用来实现流的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()方法将在socket的close方法被完成处理程序调用后返回。