我在 VB.NET 中设计了一个 SSL 服务器。
但是,当我收到多个 TCP 请求(每秒 10 秒)到我的服务器时,我会发生内存泄漏。意味着每次收到请求时内存都会增加。
模拟错误的过程:
- 监听 HTTPS (443) 端口。
- 从浏览器发出多个请求。
- 处理请求后关闭连接。
这会导致程序在每次请求时增加内存使用量。
我尝试运行 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/