private void receiveData() { if (clientSocket.Connected) { /* On crée un ReceiveBuffer qui contient un buffer temporaire dans lequel EndReceive écrira les données reçues et * un système de reconstitution des données reçues. Il est important d'envoyer cet objet au callback pour pouvoir * réceptionner la totalité des données en cas de dépassement du buffer temporaire (plus d'informations -> ReceiveBuffer.cs). */ ReceiveBuffer receiveBuffer = new ReceiveBuffer(); clientSocket.BeginReceive(receiveBuffer.tempBuffer, 0, ReceiveBuffer.BufferSize, SocketFlags.None, receiveCallback, receiveBuffer); } }
private void receiveCallback(IAsyncResult ar) { /* La méthode EndReceive écrit les données reçues dans le buffer passé en paramètre de la méthode * BeginReceive et renvoie le nombre de bytes écrits. EndReceive est en attente de nouvelles données * provenant du client distant. Si la connexion est interrompue, une exception est levée et on déclenche * l'event ClientDisconnected. * On récupère l'objet receiveBuffer afin de pouvoir reconstituer les données reçue en une ou plusieurs * fois (plus d'explications dans le fichier ReceiveBuffer.cs) */ int dataReceivedSize = 0; try { dataReceivedSize = clientSocket.EndReceive(ar); } catch (Exception e) { if (!clientSocket.Connected) { onClientDisconnected(e.Message); } } Console.WriteLine(ar.AsyncState.ToString()); ReceiveBuffer receiveBuffer = (ReceiveBuffer)ar.AsyncState; if (dataReceivedSize > 0) { /* Si des données ont été reçues, on les accumule dans le memoryStream, et si après réception il y en a encore, * on on recommence la réception asynchrone en mettant le receiveBuffer en stateObject afin que ce soit toujours * le même qui s'accumule. * Si toutes les données ont été reçues (Available = false), on désérialise le buffer et on déclenche l'event * DataReceived en mettant les données désérialisées en paramètre. */ receiveBuffer.Append(dataReceivedSize); if (clientSocket.Available > 0) { clientSocket.BeginReceive(receiveBuffer.tempBuffer, 0, ReceiveBuffer.BufferSize, SocketFlags.None, receiveCallback, receiveBuffer); } else { object data = receiveBuffer.Deserialize(); if (data != null) { onDataReceived(data); } receiveData(); } } }