如何异步关闭套接字
How to close socket asynchronously
这是我的场景。从单个线程请求对套接字进行多个异步写操作。同一个线程调用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
方法被完成处理程序调用后返回。
相关文章:
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- Boost-Beast 异步 Web 套接字 服务器-客户端异步读写 不在控制台上写入输出
- C++ Boost.Asio - TCP 套接字异步写入
- 使用相同的 udp 套接字进行异步接收/发送
- 提升同一对象上的异步套接字和线程池io_service
- 谈到套接字时使用的同步和异步术语
- 为什么在读取非HTTP服务器的套接字时需要异步IO
- C#异步套接字与C++winsock2之间的通信
- 在 winsock 服务器中使用异步套接字的非阻塞模式C++不同
- C++ 异步套接字(System.Net.Sockets.Socket.BeginAccept)与WinSock2.h
- C++ ASIO:异步套接字和线程
- 处理一个套接字和多个线程时异步 IO 的用例
- C++ 赢异步套接字.是否可以中断 select()
- 有没有更好的方法在C++中使用异步TCP套接字,而不是轮询或选择
- 异步套接字连接,当服务器断开TCP通信时,客户端GUI挂起
- 如何在linux上获得异步套接字上可读取的字节数
- 异步Boost写入Java套接字-传入的字节数组有时部分为0
- 异步等待,直到在Asio中有一个套接字可用于读/写
- 我可以在 boost::asio 异步模式下创建和接受套接字时使用 boost::shared_ptr 吗?