Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不活动后SSL流延迟_C#_Sockets_Ssl_Sslstream - Fatal编程技术网

C# 不活动后SSL流延迟

C# 不活动后SSL流延迟,c#,sockets,ssl,sslstream,C#,Sockets,Ssl,Sslstream,我已经编写了一个客户端应用程序来与第三方服务器应用程序对话。其通信通过自定义端口进行,SSL usng为SslStream类 服务器允许永久连接,但我发现我必须在60秒内用命令ping服务器,以保持合理的响应水平。60秒后,通信仍然工作,但在接收响应时有明显的延迟。正在断开连接并重新连接。只是比平常要花更长的时间。在60秒内再次发送另一个命令很快。60秒后发送另一个命令会导致延迟 这就好像在60秒后,SslStream与服务器重新协商,将传输时间延长了一倍。我知道SSL是基于会话的,这可能是原因

我已经编写了一个客户端应用程序来与第三方服务器应用程序对话。其通信通过自定义端口进行,SSL usng为SslStream类

服务器允许永久连接,但我发现我必须在60秒内用命令ping服务器,以保持合理的响应水平。60秒后,通信仍然工作,但在接收响应时有明显的延迟。正在断开连接并重新连接。只是比平常要花更长的时间。在60秒内再次发送另一个命令很快。60秒后发送另一个命令会导致延迟

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

我的代码如下(截取):

希望有人能对此有所了解

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


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

如果您想知道在低级别上发生了什么,那么不要使用SslStream,而是尝试从中使用开源SSL库

它们提供了一个名为SecureTcpClient的类,您可以访问该类来替换TcpClient


警告:此库是为.NET 1.0和1.1框架设计的。它不打算在.NET2.0框架上使用;此框架支持安全库提供的大部分功能。我只想用这个来弄清楚到底发生了什么。

谢谢你的评论-我看不到它这么快就被转移到交换了。套接字/内存占用非常小,两者之间的数据通信只有几kb。您对如何检查.NET中的内存有什么建议吗?您的意思是一分钟后的数据通信量只有几kb吗?例如,您是否检查了重新协商案例,在一分钟的不活动后发生(或未发生)?@DaveHogan在.NET中有跟踪内存管理活动的工具,但我不知道特定的标题(不是我的专业领域)。此外,SSL/TLS本身是在CryptoAPI中实现的,而不是在.NET中实现的,所以如果在CryptoAPI/CNG级别发生任何事情,.NET工具很可能不会跟踪它。
 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;
}