2012-10-31 87 views
1

我有一個異步套接字服務器和客戶端。如果我告訴客戶端連接到服務器的20,000個連接,我會收到「無法建立連接,因爲目標機器主動拒絕連接」,約25-30%的連接。這是完全可以預料的,因爲我正在敲聽監聽套接字,積壓隊列正在填滿。您應該如何處理主動拒絕的客戶端連接異常?

我的問題是:當我得到這個異常時我該怎麼辦?我應該如何處理連接,我應該關閉並關閉套接字然後嘗試重新連接?或者TCP會通過協議內的自身機制嘗試重新連接?

這裏是我的代碼OnConnected函數在AsyncCallbak的BeginConnect(),它是我在哪裏處理異常:

void OnConnected(IAsyncResult ar) 
    { 
     Socket client = (Socket)ar.AsyncState; 

     try 
     {     
      client.EndConnect(ar); 
      SocketState state = new SocketState(client, m_certValidationCallback); 

      state.sslStream.BeginAuthenticateAsClient(m_remoteHostName, m_clientCertificates, m_sslProtocols, m_checkCertificateRevocation, 
        m_onAuthenticateAsClient, state); 
     } 
     catch (Exception ex) 
     { 
      //m_connectionCallback(this, new SecureConnectionResults(ex)); 

      //What do I do here? 
      if (client != null) 
      { 
       client.Shutdown(SocketShutdown.Both); //This causes an exception 
       client.Close(); 
       client.Dispose(); 
      } 
     } 
    } 

試圖關閉在catch插座,導致另一個異常:「A請求發送或接收數據被禁止,因爲套接字未連接,並且(當使用sendto調用在數據報套接字上發送時)未提供地址「

根據此例外情況,看起來套接字未連接。再一次,它是否會嘗試基於TCP協議自行重新連接?或者我應該重新排隊連接並重試?

回答

1

我會捕獲一個更具體的例外,而不是在這種情況下調用Shutdown()。 TCP不會爲您重新連接。您必須自行重試此連接。

+0

我最終捕獲了一個套接字異常,併爲當前連接設置了isConnecting狀態布爾值,並將它重新排隊以用於BeginConnect。 – Mausimo

相關問題