2017-04-11 72 views
1

當我設置ConnectTimeout在IdSMTP(例如30秒),並且SMTP服務器不可用時,它從SMTP服務器105秒德爾福,安卓,SSL - IdSMTP ConnectTimeout - 預設超時後不會終止連接到服務器

這是版本10中的Indy組件 - * 250.bpl,OpenSSL v1.0.2。

使用IdFTP ConnectTimeout可以毫無問題地工作。

哪裏可能有bug?

... 
IdOpenSSLSetLibPath(FDocumentsPath); 

SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
SMTP:= TIdSMTP.Create(nil); 
MSG:= TIdMessage.Create(nil); 

try 
    SSLHandler.SSLOptions.Method:= sslvSSLv23; 
    SSLHandler.SSLOptions.Mode := sslmClient; 

    SMTP.IOHandler := SSLHandler; 
    SMTP.UseTLS:= utUseImplicitTLS; 
    SMTP.AuthType:= satDefault; 

    SMTP.Port:= 465; 
    SMTP.Host:= xxx.xxx.xxx.xxx; 
    SMTP.Username:= xxxxx; 
    SMTP.Password:= xxxxx; 

    SMTP.ConnectTimeout:= 30000; 
    SMTP.ReadTimeout:= 30000; 

    try 
    SMTP.Connect; 
    except 
    end; 

    ... 
finally 
    SMTP.Disconnect; 
    UnLoadOpenSSLLibrary; 

    FreeAndNil(MSG); 
    FreeAndNil(SSLHandler); 
    FreeAndNil(SMTP); 
end; 

回答

2

ConnectTimeoutTIdIOHandlerStack實現,因此同樣適用於所有的TCP客戶端組件(IOW,TIdFTPTIdSMTP使用完全相同的超時邏輯)。

但是,您必須考慮到ConnectTimeout僅適用於實際連接嘗試(調用套接字API connect()函數)。它不適用於將主機名解析爲IP地址所需的時間,也不適用於在監視超時時創建和拆除執行實際連接的工作線程所需的時間。所以ConnectTimeout是不準確的。

30秒超時時間爲105秒可能意味着DNS需要很長時間才能解析主機名,或者可能意味着一旦超時過期,套接字API不會及時中止connect()調用。調試代碼以查看實際使用時間。檢查OnStatus事件以查看在套接字未能連接到服務器時,在通知hsResolvinghsConnecting之間以及在hsConnecting通知和隨後的異常之間經過了多長時間。

+0

很好解釋。感謝雷米 – KJAN