SslStream在不活动后延迟

时间:2010-09-08 19:51:52

标签: c# sockets ssl sslstream

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

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

就好像在60秒后,SslStream与服务器重新协商,使传输时间加倍。我知道SSL是基于会话的,这可能是原因吗?有什么我可以做的,除了向服务器App发送不必要的命令以保持活着吗?

我的代码如下(剪辑):

 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 在Windows 2003和2008上托管

由于

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果您想了解低级别的内容,请尝试使用Mentalis.org

中的开源SSL库,而不是使用SslStream。

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

警告:此库是为.NET 1.0和1.1框架设计的。它不打算在.NET 2.0框架上使用;此框架支持安全库提供的大多数功能。我只会用它来弄清楚发生了什么。