2011-04-15 57 views
3

我正在嘗試處理SSL錯誤情況,例如,SSL async_handshake()所用的時間太長。 經過一段時間(比如說20秒)我想關閉這個連接(lowest_layer()。close())。 我將帶連接對象的shared_ptr作爲參數傳遞給async_handshake(),所以對象仍然存在,最終調用握手處理程序並且銷燬對象。Boost.Asio SSL ungraceful關閉

但是,我仍然零星的崩潰!看起來像close()之後SSL仍在嘗試讀取或操作讀取緩衝區。

所以,基本問題 - 硬關閉()SSL連接安全嗎?

任何想法?

回答

1

通常,我使用的方法在插座上停止未完成的異步操作,如documentation中所述,爲socket::cancel。他們的處理程序將被調用asio::error::operation_aborted作爲錯誤參數,您需要以某種方式處理。

這就是說,我沒有看到使用close而不是cancel的問題。儘管如果沒有一些代碼來分析,很難提供很多幫助或建議。


請注意,某些Windows平臺在取消未完成的異步操作時會遇到問題。如果您的應用程序需要支持Windows,則documentation has suggestions用於便攜式取消。

+0

這對async_handshake案件沒有幫助,至少對我而言。 – PSIAlt 2013-03-07 15:14:02

+0

@PSIAlt添加了一個鏈接到有關Windows平臺的文檔和'cancel()' – 2013-03-07 16:06:12

+0

的限制。謝謝,但我在Linux上遇到與OP相同的麻煩。它很容易重現:設置async_handshake並設置deadline_timer約2-5毫秒。在這個計時器中,我使用'lowest_layer()。close()'和應用程序coredumps在'SSL_connect'內關閉了'ssl :: stream'的底層連接。不知道如何解決這個問題,現在只是增加了計時器 – PSIAlt 2013-03-07 19:41:00