关闭和清理套接字的正确方法是什么?
我有 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();
}
Run Code Online (Sandbox Code Playgroud)
所有这些功能之间有什么区别?
我试过这个序列......
socket.cancel();
socket.close();
socket.release();
Run Code Online (Sandbox Code Playgroud)
并且似乎没有错误地关闭了连接但是花费了太多时间(大约 5-10 秒),所以我想我做错了什么。
我猜你说的是优雅关闭,即读/写任何未完成的数据,然后关闭套接字。
正确的步骤是:
调用shutdown()以指示您不会再向套接字写入任何数据。
继续(异步)从套接字读取,直到出现错误或连接关闭。
现在close()是套接字(在异步读取处理程序中)。
如果您不这样做,您可能最终会关闭连接,而另一方仍在发送数据。这将导致不正常的关闭。
cancel()并且release()不是您在正常流程中使用的调用:
cancel() 取消所有未完成的异步操作。release() 释放底层本机套接字的所有权。