gpt4 book ai didi

android - Delphi、Android、SSL - IdSMTP ConnectTimeout - 在预设超时后不会终止与服务器的连接

转载 作者:行者123 更新时间:2023-11-29 19:16:32 24 4
gpt4 key购买 nike

当我将 ConnectTimeout 设置为 IdSMTP(例如,30 秒)并且 SMTP 服务器不可用时,它从 SMTP 服务器起飞大约 105 秒。

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

使用 IdFTP ConnectTimeout 工作没有任何问题。

哪里可能是错误?

...
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;

最佳答案

ConnectTimeoutTIdIOHandlerStack 实现,因此同样适用于所有 TCP 客户端组件(IOW、TIdFTPTIdSMTP 使用完全相同的超时逻辑)。

但是,您必须考虑到 ConnectTimeout 仅适用于实际连接尝试(调用套接字 API connect() 函数)。它不适用于将主机名解析为 IP 地址所需的时间,也不适用于在监视超时时创建和拆除执行实际连接的工作线程所需的时间。所以 ConnectTimeout 不准确。

30 秒的超时时间为 105 秒可能意味着 DNS 需要很长时间来解析主机名,或者这可能意味着套接字 API 没有及时中止 connect() 调用一次超时已过。调试代码以查看实际花费的时间。检查 OnStatus 事件以查看 hsResolvinghsConnecting 通知之间以及 hsConnecting 通知之间经过了多少时间以及套接字无法连接到服务器时的后续异常。

关于android - Delphi、Android、SSL - IdSMTP ConnectTimeout - 在预设超时后不会终止与服务器的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43338053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com