1

我编写了一个客户端应用程序来与第三方服务器应用程序通信。它的通信是通过使用 SslStream 类的 SSL 的自定义端口进行的。

服务器允许永久连接,但是我发现我必须在 60 秒内使用命令 ping 服务器以保持合理的响应水平。60 秒后,通讯仍然有效,但收到响应时有明显延迟。它不会断开连接并重新连接。只是比平时需要更长的时间。在 60 秒内发送另一个命令又快了。60 秒后发送另一个命令会导致延迟。

就好像 60 秒后,SslStream 与服务器重新协商,使传输时间加倍。我知道 SSL 是基于会话的,这可能是原因吗?除了向服务器应用程序发送不必要的命令以使其保持活动状态之外,我能做些什么吗?

我的代码如下(截断):

 var client = new TcpClient();
 client.NoDelay = true;
 client.Connect("111.111.111.111", 6969);
 var sslStream = new SslStream(client.GetStream(), true, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
 sslStream.AuthenticateAsClient("111.111.111.111");

...

// The following method is invoked by the RemoteCertificateValidationDelegate.
private bool ValidateServerCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
    if (policyErrors == SslPolicyErrors.None)
      return true;
    else
      return false;
}

希望有人可以对此有所了解!

我的客户端应用程序是用以下语言编写的:C# / .NET 2.0 & 4.0 托管在 Windows 2003 和 2008 上

谢谢

4

2 回答 2

1

如果你想知道低级别发生了什么,那么不要使用 SslStream 尝试使用Mentalis.org的开源 SSL 库

它们提供了一个名为 SecureTcpClient 的类,您可以将其替换为 TcpClient。

警告:这个库是为 .NET 1.0 和 1.1 框架设计的。它不适用于 .NET 2.0 框架;该框架支持安全库提供的大部分功能。我只会用它来弄清楚发生了什么。

于 2010-09-18T07:25:54.767 回答
1

通常,SSL 支持重新协商,因此确实如此。另一个原因可能是服务器执行的部分代码在不活动一分钟后被交换到磁盘,以释放操作内存。当您发送请求时,应再次读取此内存。如果块很大,这可能需要一些时间。

于 2010-09-09T06:00:22.657 回答