我开发了一个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会解决我的问题吗?我问,因为我无法复制这个错误,它只是定期发生。
其他考虑因素:
更新: 在互联网上做了更多的搜索后,我发现了这个: link text
当我执行 netstat -n 时,我也会获得一堆状态为“CLOSE_WAIT”的条目。
答案 0 :(得分:3)
我终于弄明白了。事实证明我没有释放TIDHttp对象。在我的原型示例中,它显示了它。但是我的实际源代码使用对象和释放idhttp对象的代码包含在未正确标记为override的析构函数中。所以它从未被召唤过。
答案 1 :(得分:1)
尝试分配一个高端口号。挂钩低(0..1023)端口需要管理员权限IIRC。
算了吧,我的坏。 tidhttp是客户端,而不是服务器。
是的,听起来好像多线程尝试使用相同的tidhttp。
cricial部分可以使用,但可以有效地序列化结果。如果这是一个问题,请使用tidhttp客户端池。