[英]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.