【发布时间】:2019-12-10 06:22:33
【问题描述】:
我在 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
【问题讨论】:
-
我不知道它是否有帮助,但文档说在调用 .Close() 之前使用 Socket.Shutdown 方法。另外,你不应该设置
sock = Nothing。
标签: .net vb.net ssl memory-leaks sslstream