Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
        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();
                }
            }
        }