.net - 如何避免 .NET SSLStream 中的内存泄漏

标签 .net vb.net ssl memory-leaks sslstream

我在 VB.NET 中设计了一个 SSL 服务器。

但是,当我收到多个 TCP 请求(每秒 10 秒)到我的服务器时,我会发生内存泄漏。意味着每次收到请求时内存都会增加。

模拟错误的过程:

  1. 监听 HTTPS (443) 端口。
  2. 从浏览器发出多个请求。
  3. 处理请求后关闭连接。

这会导致程序在每次请求时增加内存使用量。

我尝试运行 GC.collect() 但没有任何效果。

请找到附件中的以下代码:

Private HTTPS_Listener As Socket = Nothing

Private Sub ListenS()
    Try
        HTTPS_Listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        Dim ep As New Net.IPEndPoint(IPAddress.Any, 443)
        HTTPS_Listener.Bind(ep)
        HTTPS_Listener.Listen(1024)
        HTTPS_Listener.BeginAccept(New AsyncCallback(AddressOf DoSecureCallBack), Nothing)
    Catch ex As Exception
        Console.WriteLine(ex.ToString)
    End Try
End Sub

Private Sub DoSecureCallBack(ByVal ar As IAsyncResult)
    Dim sock As Socket = Nothing
    Try
        sock = HTTPS_Listener.EndAccept(ar)
        Console.WriteLine(vbCrLf + vbCrLf + vbCrLf + "Conn received " + Threading.Interlocked.Increment(iCon).ToString)
    Catch ex As Exception
        Add_Log(0, "ERROR", "WebServer", "Could not accept web connection." + vbCrLf + ex.Message)
        Exit Sub
    Finally
        HTTPS_Listener.BeginAccept(New AsyncCallback(AddressOf DoSecureCallBack), Nothing)
    End Try

    Dim myNS As NetworkStream = Nothing
    Dim mySSLStream As SslStream = Nothing

    'Process Web Request
    Dim bytesRead As Integer = -1
    Try
        myNS = New NetworkStream(sock, False)
        mySSLStream = New SslStream(myNS, False)
        mySSLStream.AuthenticateAsServer(cert_Socket, False, SslProtocols.Tls12, False)

        mySSLStream.Write(btOut, 0, btOut.Length)
    Catch ex As Exception
        If bytesRead > 0 Then
            Console.WriteLine("Could not process Web Request." + vbCrLf + ex.Message)
        End If
    Finally
        If Not mySSLStream Is Nothing Then
            mySSLStream.Close()
            mySSLStream.Dispose()
        End If
        If Not myNS Is Nothing Then
            myNS.Close()
            myNS.Dispose()
        End If
        If Not sock Is Nothing Then
            sock.Close()
        End If
        sock = Nothing
    End Try
End Sub 'DoAcceptSocketCallback

最佳答案

检查GC.GetTotalMemory确保你有泄漏;它可能只是根据有很多可用内存为进程分配更多内存,并且比重用内存更便宜。如果是这种情况,那么在切换到重用内存时,内存增加会在某个时候达到平稳状态。

此外,如果您可以切换到 .NET Core 3.0 并使用 Async/Await 而不是 Begin/End 进行异步,则它每次接受时应该额外使用更少的内存。

关于.net - 如何避免 .NET SSLStream 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59261347/

相关文章:

c# - (args 之间的区别是 { Length : > 0}) and args. Length?

.net - 我应该在 Web API 服务与其客户端之间共享类型吗?还有哪些其他选择?

c# - 专用于字节流的FIFO/Queue buffer

VB.NET:如何在其他子循环期间保持主窗体控制?

c# - .NET 中设置的可观察顺序?

mysql - SetInitializer用于数据库错误

vb.net - 如何在 Visual Basic 应用程序中打开 "Windows Search"?

ios - SecTrustEvaluate 总是返回 kSecTrustResultRecoverableTrustFailure

ssl - NGINX 不会监听 443 端口

java - SSL socket php代码需要转换为Java