获取Indy错误“无法绑定套接字。地址和端口已在使用中”

时间:2010-05-17 12:39:01

标签: delphi

我开发了一个Delphi Web服务器应用程序(TWebModule)。它在Windows下作为Apache上的ISAPI DLL运行。该应用程序反过来使用Indy TIdHTTP组件对其他网站进行频繁的https调用。使用TIdHTTP.get方法时,我会定期收到此错误:

  

无法绑定套接字。地址和端口已在使用中

以下是代码:

  IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
  IdHTTP := TIdHTTP.create(nil);


  idhttp.handleredirects := True;
  idhttp.OnRedirect := DoRedirect;
  with IdSSLIOHandlerSocket1 do begin
    SSLOptions.Method := sslvSSLv3;
    SSLOptions.Mode :=  sslmUnassigned;
    SSLOptions.VerifyMode := [];
    SSLOptions.VerifyDepth := 2;
  end;
  with IdHTTP do begin
    IOHandler := IdSSLIOHandlerSocket1;
    ProxyParams.BasicAuthentication := False;
    Request.UserAgent := 'Test Google Analytics Interface';
    Request.ContentType := 'text/html';
    request.connection := 'keep-alive';
    Request.Accept := 'text/html, */*';
  end;
  try
    idhttp.get('http://www.mysite.com......');
  except
    .......
  end;
  IdHTTP.free;
  IdSSLIOHandlerSocket1.free;

我已经阅读了 reusesocket 方法,该方法可以在TIdHttp和TIdSSLLIOHandlerSocketOpenSSL对象上设置。将此设置为rsTrue会解决我的问题吗?我问,因为我无法复制这个错误,它只是定期发生。

其他考虑因素:

  • 我知道正在生成多个TWebModule实例。
  • 在TCriticalSection中包装所有对TIdHttp.get的调用会解决问题吗?

更新: 在互联网上做了更多的搜索后,我发现了这个: link text

当我执行 netstat -n 时,我也会获得一堆状态为“CLOSE_WAIT”的条目。

2 个答案:

答案 0 :(得分:3)

我终于弄明白了。事实证明我没有释放TIDHttp对象。在我的原型示例中,它显示了它。但是我的实际源代码使用对象和释放idhttp对象的代码包含在未正确标记为override的析构函数中。所以它从未被召唤过。

答案 1 :(得分:1)

尝试分配一个高端口号。挂钩低(0..1023)端口需要管理员权限IIRC。

算了吧,我的坏。 tidhttp是客户端,而不是服务器。

是的,听起来好像多线程尝试使用相同的tidhttp。

cricial部分可以使用,但可以有效地序列化结果。如果这是一个问题,请使用tidhttp客户端池。