Asio 端套接字函数:取消、关闭、关闭、释放
Asio end socket functions: cancel, shutdown, close, release
关闭和清理套接字的正确方法是什么?
我在辅助线程中有 io_service 运行,我需要从主线程关闭连接:
void closeConnection()
{
ioc.post([&socket]() {
// Which ones do I have to call?
// In what order?
// What do they do?
//socket.cancel();
//socket.shutdown(asio::ip::tcp::socket::shutdown_both);
//socket.close();
//socket.release();
});
secondaryThread.join();
}
这些函数有什么区别?
我试过这个序列...
socket.cancel();
socket.close();
socket.release();
并且似乎没有错误地关闭了连接,但是花费了太多时间(大约 5-10 秒),所以我想我做错了什么。
我猜你说的是正常关闭,即read/write任何未完成的数据,然后关闭套接字。
正确的步骤是:
调用shutdown()
表示不再向套接字写入数据
继续(异步)从套接字读取,直到出现错误或连接关闭。
现在 close()
套接字(在异步读取处理程序中)。
如果不这样做,您可能会在对方仍在发送数据时关闭连接。这将导致不正常的关闭。
cancel()
和 release()
不是您在正常流程中使用的调用:
cancel()
取消所有未完成的异步操作。
release()
释放底层本机套接字的所有权。
关闭和清理套接字的正确方法是什么?
我在辅助线程中有 io_service 运行,我需要从主线程关闭连接:
void closeConnection()
{
ioc.post([&socket]() {
// Which ones do I have to call?
// In what order?
// What do they do?
//socket.cancel();
//socket.shutdown(asio::ip::tcp::socket::shutdown_both);
//socket.close();
//socket.release();
});
secondaryThread.join();
}
这些函数有什么区别?
我试过这个序列...
socket.cancel();
socket.close();
socket.release();
并且似乎没有错误地关闭了连接,但是花费了太多时间(大约 5-10 秒),所以我想我做错了什么。
我猜你说的是正常关闭,即read/write任何未完成的数据,然后关闭套接字。
正确的步骤是:
调用
shutdown()
表示不再向套接字写入数据继续(异步)从套接字读取,直到出现错误或连接关闭。
现在
close()
套接字(在异步读取处理程序中)。
如果不这样做,您可能会在对方仍在发送数据时关闭连接。这将导致不正常的关闭。
cancel()
和 release()
不是您在正常流程中使用的调用:
cancel()
取消所有未完成的异步操作。release()
释放底层本机套接字的所有权。