德爾福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適用於大多數其他組件。)
這可以很好的與原來的代碼實際上將這兩個組件封裝在另一個內部 - 所以我可以使用On(Dis)Connected事件來維護我自己的屬性進行測試。謝謝。 – GeoffW