asio端socket函数:cancel、shutdown、close、release

tuk*_*ket 5 c++ boost-asio

关闭和清理套接字的正确方法是什么?

我有 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 秒),所以我想我做错了什么。

rus*_*tyx 6

我猜你说的是优雅关闭,即读/写任何未完成的数据,然后关闭套接字。

正确的步骤是:

  1. 调用shutdown()以指示您不会再向套接字写入任何数据。

  2. 继续(异步)从套接字读取,直到出现错误或连接关闭。

  3. 现在close()是套接字(在异步读取处理程序中)。

如果您不这样做,您可能最终会关闭连接,而另一方仍在发送数据。这将导致不正常的关闭。


cancel()并且release()不是您在正常流程中使用的调用:

  • cancel() 取消所有未完成的异步操作。
  • release() 释放底层本机套接字的所有权。