Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.75 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6.  
  7. namespace CustomSocket
  8. {
  9.     class CustomBuffer
  10.     {
  11.         private CustomSocket m_CustomSocket;
  12.         private Queue<byte> m_Queue;
  13.         private readonly object m_QueueLock = new object();
  14.  
  15.         public CustomBuffer(CustomSocket CustomSocket)
  16.         {
  17.             this.m_Queue = new Queue<byte>();
  18.             this.m_CustomSocket = CustomSocket;
  19.         }
  20.  
  21.         public void WriteBytes(byte[] data)
  22.         {
  23.             lock (this.m_QueueLock)
  24.             {
  25.                 foreach (byte b in data)
  26.                     this.m_Queue.Enqueue(b);
  27.  
  28.                 //Vérifier que le packet est entier pour ensuite l'envoyer à l'event
  29.                 ushort header = ReadMessageHeader();
  30.                 int ID = ReadMessageId(header);
  31.                 int longueur = ReadMessageLength(header);
  32.  
  33.                 while (true)
  34.                 {
  35.                     if (this.Length >= longueur)
  36.                     {
  37.                         byte[] message = this.ReadBytes(longueur);
  38.                         this.m_CustomSocket.onFullMessage(this.m_CustomSocket, new FullMessageEventArgs(message));
  39.                     }
  40.                     else
  41.                     {
  42.                         break;
  43.                     }
  44.                 }
  45.             }
  46.         }
  47.  
  48.         private ushort ReadMessageHeader()
  49.         {
  50.             return (ushort)((this.ReadByte() << 8) + this.ReadByte());
  51.         }
  52.  
  53.         private int ReadMessageId(ushort header)
  54.         {
  55.             return header >> 2;
  56.         }
  57.  
  58.         private int ReadMessageLength(ushort header)
  59.         {
  60.             switch ((header & 3))
  61.             {
  62.                 case 1:
  63.                     return this.ReadByte();
  64.                 case 2:
  65.                     return (ushort)((this.ReadByte() << 8) + this.ReadByte());
  66.                 case 3:
  67.                     return ((int)(this.ReadByte()) << 16) + ((int)(this.ReadByte()) << 8) + this.ReadByte();
  68.                 default:
  69.                     return 0;
  70.             }
  71.         }
  72.  
  73.         private byte ReadByte()
  74.         {
  75.             lock (this.m_QueueLock)
  76.             {
  77.                 return this.m_Queue.Dequeue();
  78.             }
  79.         }
  80.  
  81.         private byte[] ReadBytes(int len)
  82.         {
  83.             byte[] result = new byte[len];
  84.  
  85.             lock (this.m_QueueLock)
  86.             {
  87.                 for (int i = 0; i < len; i++)
  88.                 {
  89.                     result[i] = this.m_Queue.Dequeue();
  90.                 }
  91.                 return result;
  92.             }
  93.         }
  94.  
  95.         public int Length
  96.         {
  97.             get { return this.m_Queue.Count(); }
  98.         }
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement