1

非同期ソケット サーバーとクライアントがあります。クライアントにサーバーへの接続を 20,000 回行うように指示すると、約 25 ~ 30% の接続で「ターゲット マシンがアクティブに拒否したため、接続できませんでした」というメッセージが表示されます。リッスン ソケットを叩いていて、バックログ キューがいっぱいになっているので、これは完全に予想されることです。

私が持っている質問は、次のとおりです。この例外が発生した場合、どうすればよいですか? 接続をどのように処理する必要がありますか?ソケットをシャットダウンして閉じてから再接続しようとする必要がありますか? それとも、TCP はプロトコル内の独自のメカニズムを介して再接続を試みますか?

これは、BeginConnect() の AsyncCallbak である私のコード OnConnected 関数であり、ここで例外を処理しています。

    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();
            }
        }
    }

キャッチでソケットをシャットダウンしようとすると、別の例外が発生します。

この例外によると、ソケットが接続されていないようです。もう一度、TCP プロトコルに基づいて独自に再接続しようとしますか? または、接続を再キューして再試行する必要がありますか?

4

1 に答える 1

1

より具体的な例外をキャッチし、Shutdown()この条件下では呼び出しません。TCP は再接続しません。この接続は自分で再試行する必要があります。

于 2012-10-31T16:30:40.743 に答える