簡體   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