2010-12-09 48 views
4

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

回答

2

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

很可能使用你调用close(因为它 报告错误处理程序)后,然后接入到死指针这个插座被称为处理程序之一...

通常情况下,续航时间处理可能是什么可以用boost::shared_ptrboost::enable_shared_from_this轻松完成,并将其传递给处理程序。查看Boost.Asio提供的许多示例。

一旦你熟悉了这种技术,你问的问题对你来说看起来微不足道。

+0

我不想使用智能指针,因为原始指针对我来说更为原生。 – vladimir 2010-12-09 11:35:38

+5

@vladimir,只是因为你觉得某些东西更本土,并不是很好的做法。智能指针解决了许多问题,否则可以成为一个ballache :) – 2010-12-09 11:37:21

1

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