我開發了一個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」條目。
你的意思是在idhttp組件上使用靜態端口?服務器上是否有可能導致此端口發生衝突的其他功能? – 2010-05-17 14:12:52
好的 - 我會試試這個。所以如果我理解正確的話;不允許通過同一端口與TIdHttp同時通話。一次只能有一個電話。但是,讓我感到困惑的是,一旦發生這種錯誤,它會繼續進行所有後續調用(即使我確信它們不會與其他調用同時發生)。就好像一旦它被打破,它就會破裂。 – 2010-05-18 02:30:23
問題:我是否需要爲tidhttp客戶端池創建自己的「管理」? – 2010-05-18 20:32:14