【发布时间】:2010-12-09 11:17:18
【问题描述】:
我正在为我的服务器应用程序使用 boost 异步套接字。我创建了一个 disconnect() 函数,该函数调用 boost 的 close(),然后删除套接字(操作符删除)。 当从其中一个异步调用函数时也没关系。处理程序,但是当我从主代码库中调用它时,整个应用程序在其中一个异步处理程序处崩溃。 如何在 boost 中很好地关闭套接字?
【问题讨论】:
标签: c++ sockets boost boost-asio
我正在为我的服务器应用程序使用 boost 异步套接字。我创建了一个 disconnect() 函数,该函数调用 boost 的 close(),然后删除套接字(操作符删除)。 当从其中一个异步调用函数时也没关系。处理程序,但是当我从主代码库中调用它时,整个应用程序在其中一个异步处理程序处崩溃。 如何在 boost 中很好地关闭套接字?
【问题讨论】:
标签: c++ sockets boost boost-asio
确保只要可能使用它的处理程序存在,该对象就处于活动状态。
很可能在您调用 close 后调用了使用此套接字的处理程序之一(因为它 将错误报告给处理程序)然后访问死指针...
通常,使用boost::shared_ptr 和boost::enable_shared_from_this 并在处理程序中传递它可以轻松完成生命周期处理。查看 Boost.Asio 提供的大量示例。
一旦您熟悉了这项技术,您提出的问题对您来说就显得微不足道了。
【讨论】:
您也确实想查看套接字上的关闭方法。它不会解决您崩溃的应用程序。上面的 Artyom 已经解释了造成这种情况的原因,但它仍然很有趣。 如果您在不调用 shutdown 的情况下关闭套接字,则可能会发送 RST 而不是优雅的 FIN 握手。
【讨论】: