C++ IdSMTP卡在连接方法上

C++ IdSMTP卡在连接方法上,c++,delphi,smtp,indy,smtpclient,C++,Delphi,Smtp,Indy,Smtpclient,我正在使用IdSMTP并在表单中动态创建/销毁TIDMTP组件。大多数情况下,smtp.Connect没有问题,但我发现在某些情况下,主用户界面会被卡住并没有响应 我添加了ConnectTimeout和ReadTimeout属性,但仍然遇到相同的问题。应用程序变得无响应,并迫使我们终止进程 smtp.ConnectTimeout := 10000; smtp.ReadTimeout := 10000; smtp.Connect; if smtp.Connected then

我正在使用IdSMTP并在表单中动态创建/销毁TIDMTP组件。大多数情况下,smtp.Connect没有问题,但我发现在某些情况下,主用户界面会被卡住并没有响应

我添加了ConnectTimeout和ReadTimeout属性,但仍然遇到相同的问题。应用程序变得无响应,并迫使我们终止进程

  smtp.ConnectTimeout := 10000;
  smtp.ReadTimeout := 10000;
  smtp.Connect;
  if smtp.Connected then
  begin
    smtp.Send(Mess);
    smtp.Disconnect;
  end
我有一个绑定到stmp的OnStatus事件,该事件由idstmp控件引发 解决 连接 连接的


但由于某些原因,Connect仍然使应用程序处于空闲状态,并且没有响应。

每当我使用TidSMTP时,我都会在线程中使用它,这样,UI将始终有响应,使用回调|事件来显示进度/消息等。根本问题是组件在Connect方法上被阻止/卡住。。。如果我同时设置了ConnectTimeout和ReadTimeout。只需将其移动到线程中,就意味着UI不会被卡住,但线程仍将被阻止发送,除非我对其设置了不同的超时。ConnectTimeout仅适用于套接字实际连接到服务器时,ReadTimeout仅适用于在建立连接后读取数据时。在这两种情况发生之前,如果指定的主机还不是IP地址,则TIDMTP必须对其执行DNS查找,并且该DNS查找由Indy无法控制的操作系统执行。如果您的计算机的DNS设置未正确设置,则可能导致Connect中出现此类死锁。您可以验证OnStatus事件是否达到hsResolving但未达到hsConnection。好的,我将在日志记录中添加状态信息,以观察其卡住的位置。但是,有没有办法为dns设置resolvetimeout?或者我必须编写自己的代码来解析超时的dns吗?正如我所说,操作系统是执行实际dns查找的操作系统,而不是Indy。操作系统决定何时放弃,而不是Indy。因此,没有办法设置Indy内部使用的DNS查找超时,如果事实上这就是死锁实际发生的地方。您可以尝试为自己的DNS查询使用TIdDNSResolver组件,该组件具有WaitingTime属性,但当前仅用于基于UDP的查询,如果您不请求AXFR或IXFR记录,则使用该组件,而这些记录使用基于TCP的查询。