2010-12-09 90 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握手。

相關問題