什么是BeginReceive(Byte(),Int32,Int32,SocketFlags,AsyncCallback,Object)和socket中的回调方法?

我是套接字编程的新手。 因此,最近我被分配到使用vb.net进行套接字编程的任务,以找出为什么这个程序分配了近20GB的物理内存。 但由于我对Socket没有足够的知识,所以我完全陷入困境。 我发现BeginReceive()方法和EndReceive()方法作为回调在程序中,当我搜索这些时,我发现一些信息,应该调用EndReceive()进行回调。 所以,我的问题是:

  1. 我是否需要在EndReceive()之后BeginReceive()调用EndReceive()方法来清除缓冲区以便内存分配变得清晰?
  2. 如果有人用简单的词语解释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作为参数。” 和“获取Socket后,您可以调用EndConnect方法成功完成连接尝试。”

而且:“异步BeginReceive操作必须通过调用EndReceive方法来完成。通常,该方法由回调委托调用。”

所以,是的,您必须调用EndReceive来获取EndReceive的结果。

另外,作为对第二个问题的回答:“要获取接收的数据,请调用IAsyncResultAsyncState方法,并提取生成的状态对象中包含的缓冲区。” 因此结果在IAsyncResult对象中缓冲。 从那里提取它并摆脱对象让GC收集它。

来源: BeginReceive , EndReceive , IAsyncResult 。