【问题标题】:Boost::asio sockets - how to disconnect them cleanly?Boost::asio 套接字 - 如何干净地断开它们?
【发布时间】:2010-12-09 11:17:18
【问题描述】:

我正在为我的服务器应用程序使用 boost 异步套接字。我创建了一个 disconnect() 函数,该函数调用 boost 的 close(),然后删除套接字(操作符删除)。 当从其中一个异步调用函数时也没关系。处理程序,但是当我从主代码库中调用它时,整个应用程序在其中一个异步处理程序处崩溃。 如何在 boost 中很好地关闭套接字?

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:

    确保只要可能使用它的处理程序存在,该对象就处于活动状态。

    很可能在您调用 close 后调用了使用此套接字的处理程序之一(因为它 将错误报告给处理程序)然后访问死指针...

    通常,使用boost::shared_ptrboost::enable_shared_from_this 并在处理程序中传递它可以轻松完成生命周期处理。查看 Boost.Asio 提供的大量示例。

    一旦您熟悉了这项技术,您提出的问题对您来说就显得微不足道了。

    【讨论】:

    • 我不想使用智能指针,因为原始指针对我来说更原生。
    • @vladimir,仅仅因为你觉得某些东西更本地化,并不能让它成为一个好的实践。智能指针解决了很多问题,否则可能会很麻烦:)
    【解决方案2】:

    您也确实想查看套接字上的关闭方法。它不会解决您崩溃的应用程序。上面的 Artyom 已经解释了造成这种情况的原因,但它仍然很有趣。 如果您在不调用 shutdown 的情况下关闭套接字,则可能会发送 RST 而不是优雅的 FIN 握手。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2011-10-15
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多