繁体   English   中英

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

[英]What is BeginReceive(Byte(), Int32, Int32, SocketFlags, AsyncCallback, Object) and callback method in socket?

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

  1. 我是否需要每次在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作为参数。” 和“获取套接字后,您可以调用EndConnect方法来成功完成连接尝试。”

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

所以,是的,你必须调用EndReceive得到的结果BeginReceive

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

来源: BeginReceiveEndReceiveIAsyncResult

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM