Qu’est-ce que BeginReceive (Byte (), Int32, Int32, SocketFlags, AsyncCallback, Object) et la méthode de rappel dans socket?

Je suis tellement nouveau dans la programmation de socket. Ainsi, récemment, je suis affecté à une tâche de programmation de sockets utilisant vb.net pour découvrir pourquoi ce programme alloue près de 20 Go de mémoire physique. Mais comme je ne connais pas bien Socket, je suis coincé à l’intérieur. J’ai trouvé que la méthode BeginReceive() et la méthode EndReceive() dans le programme et lorsque j’ai EndReceive() sur EndReceive() j’ai trouvé des informations selon EndReceive() devait être appelé pour le rappel. Donc, ma question est:

  1. Dois-je appeler la méthode EndReceive() après BeginReceive() chaque fois pour vider le tampon afin que l’allocation de mémoire soit BeginReceive() ?
  2. J’apprécierais vraiment si quelqu’un explique en termes simples ce que veut vraiment dire BeginReceive() et EndReceive() ?

Mise à jour: Veuillez vérifier le code ci-dessous que j’ai trouvé dans le projet:

 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 Ssortingng = "" Dim sendData As Ssortingng = "" Dim bytesRead As Integer = client.EndReceive(ar) If bytesRead > 0 Then state.sb.Append(System.Text.Encoding.ASCII.GetSsortingng(state.buffer, 0, bytesRead)) client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReceiveCallback), state) receiveData = state.sb.ToSsortingng() Me.lsBulk.Items.Insert(0, receiveData) sendData = getReply(receiveData) write_log(Now.ToSsortingng & " : " & receiveData & vbCrLf, "bytesRead", "bytesRead") Try Dim objData As [Object] = sendData Dim byData As Byte() = System.Text.Encoding.ASCII.GetBytes(objData.ToSsortingng()) If m_clientSocket IsNot Nothing Then m_clientSocket.Send(byData) End If write_log(Now.ToSsortingng & " : " & sendData & vbCrLf, "sendData", "sendData") Catch se As SocketException logstr = se.Message write_log(logstr, "WaitForData", "waitfordata") End Try Else receiveData = state.sb.ToSsortingng() If receiveData  "" Then write_log(Now.ToString & " : " & receiveData & vbCrLf, "receiveData2", "receiveData2") End If End If End Sub 

Selon la documentation, BeginReceive “commence à recevoir des données de manière asynchrone à partir d’un Socket connecté”. Donc, en langage normal: commencez à recevoir des données tout en continuant l’exécution du programme.

Dans la documentation de EndReceive “la méthode de rappel doit accepter le paramètre IAsyncResult renvoyé par la méthode BeginConnect”. et “Après avoir obtenu le Socket, vous pouvez appeler la méthode EndConnect pour mener à bien la tentative de connexion.”

Et aussi: “L’opération asynchrone BeginReceive doit être complétée en appelant la méthode EndReceive. En règle générale, la méthode est appelée par le délégué de rappel.”

Alors oui, vous devez appeler EndReceive pour obtenir les résultats de BeginReceive .

De plus, pour répondre à votre deuxième question: “Pour obtenir les données reçues, appelez la méthode AsyncState de IAsyncResult et extrayez la mémoire tampon contenue dans l’object d’état résultant.” Ainsi, le résultat est mis en mémoire tampon dans l’object IAsyncResult . Extrayez-le de là et débarrassez-vous de l’object pour le laisser le récupérer.

Source: BeginReceive , EndReceive , IAsyncResult .