gpt4 book ai didi

c++ - Asio 端套接字函数 : cancel, 关闭、关闭、释放

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:31 27 4
gpt4 key购买 nike

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

我在辅助线程中运行 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 秒),所以我想我做错了什么。

最佳答案

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

正确的步骤是:

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

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

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

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


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

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

关于c++ - Asio 端套接字函数 : cancel, 关闭、关闭、释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51468848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com