为什么我不能使用 .Net 中的套接字安全地连接到某个服务器两次

Why can't I connect securely to some server twice using sockets in .Net

当我尝试使用 .Net 套接字打开到网络服务器的安全连接时,我遇到了一个非常奇怪的问题。

对于大多数网络服务器,下面的代码可以正常工作,但对于其他服务器,它会在第二次尝试时失败。我不明白为什么有人可以向我指出问题?

示例代码:

    protected static void Connect(string hostname, int port, bool secure)
    {
        IPAddress[] ips = Dns.GetHostAddresses(hostname);
        Socket socket = null;

        foreach (var ip in ips)
        {
            socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(ip, port);
            break;
        }

        NetworkStream LowLevelStream = new NetworkStream(socket);
        SslStream LowLevelSecureStream = new SslStream(LowLevelStream, false, AcceptAllCertifications);
        LowLevelSecureStream.AuthenticateAsClient(hostname, new X509CertificateCollection(), SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2, false);

        socket.Shutdown(SocketShutdown.Both);
        socket.Close();
    }

通常运行此代码(甚至不止一次)会导致一个或多个成功连接:

    static void Main(string[] args)
    {
        Connect("www.browseemall.com", 443, true);
        Connect("www.browseemall.com", 443, true);

        Console.ReadKey();
    }

但对于某些主机,相同的代码会导致异常:

    static void Main(string[] args)
    {
        Connect("www.whosebug.com", 443, true);
        Connect("www.whosebug.com", 443, true);

        Console.ReadKey();
    }

有人知道那可能是什么吗(我相信这很明显)?谢谢!

经过大量尝试和错误后,我找到了解决方案:

而不是

LowLevelSecureStream.AuthenticateAsClient(hostname, new X509CertificateCollection(), SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2, false);

你需要使用

LowLevelSecureStream.AuthenticateAsClient(hostname);