为什么我不能使用 .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);
当我尝试使用 .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);