2010-05-17 77 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

相關問題