[英]What is BeginReceive(Byte(), Int32, Int32, SocketFlags, AsyncCallback, Object) and callback method in socket?
我在套接字編程方面很新。 因此,最近我被分配到一個使用vb.net進行套接字編程的任務,以找出為什么該程序分配了近20GB的物理內存。 但是由於我對Socket沒有足夠的了解,所以我深陷其中。 我發現程序中有BeginReceive()
方法和EndReceive()
方法作為回調位於程序中,當我搜索這些內容時,我發現一些信息應調用EndReceive()
進行回調。 所以,我的問題是:
BeginReceive()
之后調用EndReceive()
方法來清除緩沖區,以便清除內存分配? BeginReceive()
和EndReceive()
真正含義,我將不勝感激。 更新:請檢查我在項目中找到的以下代碼:
Public Sub Receive(ByVal client As Socket)
Dim state As New StateObject
state.workSocket = client
Try
If m_clientSocket.Connected Then
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReceiveCallback), state)
Else
Connect()
End If
Catch se As SocketException
logstr = se.Message
write_log(logstr, "Receive", "Receive")
End Try
End Sub
Public Sub ReceiveCallback(ByVal ar As IAsyncResult)
Dim state As StateObject = CType(ar.AsyncState, StateObject)
Dim client As Socket = state.workSocket
Dim receiveData As String = ""
Dim sendData As String = ""
Dim bytesRead As Integer = client.EndReceive(ar)
If bytesRead > 0 Then
state.sb.Append(System.Text.Encoding.ASCII.GetString(state.buffer, 0, bytesRead))
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReceiveCallback), state)
receiveData = state.sb.ToString()
Me.lsBulk.Items.Insert(0, receiveData)
sendData = getReply(receiveData)
write_log(Now.ToString & " : " & receiveData & vbCrLf, "bytesRead", "bytesRead")
Try
Dim objData As [Object] = sendData
Dim byData As Byte() = System.Text.Encoding.ASCII.GetBytes(objData.ToString())
If m_clientSocket IsNot Nothing Then
m_clientSocket.Send(byData)
End If
write_log(Now.ToString & " : " & sendData & vbCrLf, "sendData", "sendData")
Catch se As SocketException
logstr = se.Message
write_log(logstr, "WaitForData", "waitfordata")
End Try
Else
receiveData = state.sb.ToString()
If receiveData <> "" Then
write_log(Now.ToString & " : " & receiveData & vbCrLf, "receiveData2", "receiveData2")
End If
End If
End Sub
根據文檔BeginReceive
“開始從連接的Socket
異步接收數據。”。 因此,以普通語言顯示:在繼續執行程序的同時開始接收數據。
在EndReceive
的文檔中,“回調方法必須接受BeginConnect方法返回的IAsyncResult作為參數。” 和“獲取套接字后,您可以調用EndConnect方法來成功完成連接嘗試。”
並且:“異步BeginReceive操作必須通過調用EndReceive方法來完成。通常,該方法由回調委托調用。”
所以,是的,你必須調用EndReceive
得到的結果BeginReceive
。
另外,作為對第二個問題的回答:“要獲取接收到的數據,請調用IAsyncResult
的AsyncState
方法,並提取包含在結果狀態對象中的緩沖區。” 因此,結果將緩存在IAsyncResult
對象中。 從那里提取它並擺脫對象,讓GC收集它。
來源: BeginReceive , EndReceive , IAsyncResult 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.