1

我有一个异步套接字服务器和客户端。如果我告诉客户端与服务器建立 20,000 个连接,我会在大约 25-30% 的连接中收到“无法建立连接,因为目标机器主动拒绝它”。这是完全可以预料的,因为我正在敲击监听套接字并且积压队列正在填满。

我的问题是:当我得到这个异常时我该怎么办?我应该如何处理连接,我应该关闭并关闭套接字然后尝试重新连接?还是 TCP 会尝试通过协议中自己的机制重新连接?

这是我的代码 OnConnected 函数,它是 BeginConnect() 的 AsyncCallbak,我正在处理异常:

    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 中的套接字会导致另一个异常:“由于未连接套接字并且(使用 sendto 调用在数据报套接字上发送时)未提供地址,因此不允许发送或接收数据的请求”

根据此异常,似乎套接字未连接。再次,它会尝试基于 TCP 协议自行重新连接吗?还是我应该重新排队连接并重试?

4

1 回答 1

1

我会捕获一个更具体的异常,而不是Shutdown()在这种情况下调用。TCP 不会为您重新连接。您必须自己重试此连接。

于 2012-10-31T16:30:40.743 回答