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協議自行重新連接?或者我應該重新排隊連接並重試?
我最終捕獲了一個套接字異常,併爲當前連接設置了isConnecting狀態布爾值,並將它重新排隊以用於BeginConnect。 – Mausimo