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任何未完成的数据,然后关闭套接字。

正确的步骤是:

  1. 调用shutdown()表示不再向套接字写入数据

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

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

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


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

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