2010-05-17 40 views
1

我开发了一个Delphi Web服务器应用程序(TWebModule)。它在Windows下作为Apache上的ISAPI DLL运行。该应用程序反过来会使用Indy TIdHTTP组件频繁地对其他网站进行https调用。定期使用TIdHTTP.get方法时出现此错误:获取Indy错误“无法绑定套接字,地址和端口已在使用中”

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

下面是代码:

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的多个实例正在催生。
  • 是否将所有对TIdHttp.get的调用都封装在TCriticalSection中解决了问题?

UPDATE: 做更多的搜索我碰到这个来在互联网上后: link text

当我做了的netstat -n我也得到了一堆状态为“CLOSE_WAIT”条目。

回答

2

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

1

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

忘记吧,我的不好。 tidhttp是客户端,而不是服务器。

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

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

+0

你的意思是在idhttp组件上使用静态端口?服务器上是否有可能导致此端口发生冲突的其他功能? – 2010-05-17 14:12:52

+0

好的 - 我会试试这个。所以如果我理解正确的话;不允许通过同一端口与TIdHttp同时通话。一次只能有一个电话。但是,让我感到困惑的是,一旦发生这种错误,它会继续进行所有后续调用(即使我确信它们不会与其他调用同时发生)。就好像一旦它被打破,它就会破裂。 – 2010-05-18 02:30:23

+0

问题:我是否需要为tidhttp客户端池创建自己的“管理”? – 2010-05-18 20:32:14

相关问题