2016-07-14 30 views
2

德爾福v10.1柏林。 Indy v10.6.2 OpenSSL v1.0.2hIndy OpenSSL問題如果測試在回調期間連接

我有一個表格,我在Delphi中設置了使用TIdIMAP4與SSL連接(TIdSSLIOHandlerSocketOpenSSL)進行測試。因爲這是用於測試的,所以我設置了一個複選框來顯示IMAP組件當前是否已連接,並將IMAP和SSL IOHandler的OnStatus和OnStatusInfo事​​件連接到更新複選框的代碼。該代碼很乾脆:

IsConnectedCB.Checked := imap.Connected; 

最後(我花的時間比我願意承認),我曾指出,這是什麼一直在擾亂SSL連接。這裏是發生了什麼(日誌狀態消息)的例子:

02:35:13 S: Resolving hostname localhost. 
02:35:13 S: Connecting to 127.0.0.1. 
02:35:13 S: Connected. 
02:35:13 S: SSL status: "before/connect initialization" 
02:35:13 S: SSL status: "before/connect initialization" 
02:35:13 S: SSL status: "SSLv3 write client hello A" 
02:35:13 S: SSL status: "SSLv3 read server hello A" 
02:35:43 S: SSL status: "SSLv3 read server certificate A" 
02:35:46 S: Disconnecting. 
02:35:46 S: Disconnected. 
02:35:48 E: SSL negotiation failed. 

通知的時間差下面的「服務器問候A」(在「客戶端問候A」有時會發生) - 這是連接嘗試超時。

事實證明,對imap.Connected的調用最終在IOHandler中進行查詢,並擾亂了回調處理。

解決方法很簡單:不要在回調過程中讀取Connected屬性。 :-)

但是,我希望能夠在測試各種長時間運行的進程時更新我的​​表單狀態,並且OnStatus/OnStatusInfo事​​件對於這種情況非常方便(而不是散佈我自己的代碼,並且有很多調用需要更新)。所以...

我的問題是:有沒有辦法告訴什麼時候測試連接屬性是安全的? (在這種情況下TIdIMAP4.Connected,但我敢肯定,這個問題必須使用OpenSSL適用於大多數其他組件。)

回答

2

有沒有辦法告訴當它是安全的測試Connected屬性?

正如您發現的,Connected執行讀取操作。執行套接字I/O是確定阻塞套接字是否仍連接且有效的唯一方法。所以,當讀取會干擾其他也需要執行I/O操作的流程時,您不能使用Connected

事實上,在大多數情況下,你確實不應該直接使用Connected。在這種情況下,我建議使用TIdIMAP4.On(Dis)Connected和/或TIdIMAP4.OnStatus事件來更新Boolean變量,然後讓代碼的其餘部分在需要時檢查該變量。

+0

這可以很好的與原來的代碼實際上將這兩個組件封裝在另一個內部 - 所以我可以使用On(Dis)Connected事件來維護我自己的屬性進行測試。謝謝。 – GeoffW