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

时间:2017-04-11 06:13:52

标签: android openssl indy10 delphi-10.2-tokyo

当我在IdSMTP设置ConnectTimeout(例如,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;

1 个答案:

答案 0 :(得分:2)

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

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

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