【问题标题】:What should you do to handle an actively refused client connection exception?您应该如何处理主动拒绝的客户端连接异常?
【发布时间】:2012-10-31 16:22:52
【问题描述】:

我有一个异步套接字服务器和客户端。如果我告诉客户端与服务器建立 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 协议自行重新连接?还是我应该重新排队连接并重试?

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

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

    【讨论】:

    • 我最终捕捉到了一个 Socket 异常,并为当前连接设置了一个 isConnecting 状态布尔值,并为 BeginConnect 重新排队。
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2016-09-15
    相关资源
    最近更新 更多