首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asio终端套接字功能:取消、关闭、关闭、释放

Asio终端套接字功能:取消、关闭、关闭、释放
EN

Stack Overflow用户
提问于 2018-07-22 20:06:07
回答 1查看 3.2K关注 0票数 6

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

我将io_service运行在一个辅助线程中,我需要从主线程关闭连接:

代码语言:javascript
复制
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();
}

所有这些功能之间有什么区别?

我试过这个序列..。

代码语言:javascript
复制
socket.cancel();
socket.close();
socket.release();

并且似乎没有错误地关闭连接,但是花费了太多的时间(大约5-10秒),所以我想我做错了一些事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-22 20:45:09

我想您是在说一个优雅的结尾,即读/写任何未完成的数据,然后关闭套接字。

适当的步骤是:

  1. 调用shutdown()以指示您将不再向套接字写入任何数据。
  2. 继续从套接字读取(异步),直到收到错误或连接关闭为止。
  3. 现在,close()套接字(在异步读取处理程序中)。

如果不这样做,则可能会在另一方仍在发送数据时关闭连接。这将导致一场不光彩的结局。

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

  • cancel()取消所有未执行的异步操作。
  • release()释放底层本机套接字的所有权。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51468848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档