Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- namespace CustomSocket
- {
- class CustomBuffer
- {
- private CustomSocket m_CustomSocket;
- private Queue<byte> m_Queue;
- private readonly object m_QueueLock = new object();
- public CustomBuffer(CustomSocket CustomSocket)
- {
- this.m_Queue = new Queue<byte>();
- this.m_CustomSocket = CustomSocket;
- }
- public void WriteBytes(byte[] data)
- {
- lock (this.m_QueueLock)
- {
- foreach (byte b in data)
- this.m_Queue.Enqueue(b);
- //Vérifier que le packet est entier pour ensuite l'envoyer à l'event
- ushort header = ReadMessageHeader();
- int ID = ReadMessageId(header);
- int longueur = ReadMessageLength(header);
- while (true)
- {
- if (this.Length >= longueur)
- {
- byte[] message = this.ReadBytes(longueur);
- this.m_CustomSocket.onFullMessage(this.m_CustomSocket, new FullMessageEventArgs(message));
- }
- else
- {
- break;
- }
- }
- }
- }
- private ushort ReadMessageHeader()
- {
- return (ushort)((this.ReadByte() << 8) + this.ReadByte());
- }
- private int ReadMessageId(ushort header)
- {
- return header >> 2;
- }
- private int ReadMessageLength(ushort header)
- {
- switch ((header & 3))
- {
- case 1:
- return this.ReadByte();
- case 2:
- return (ushort)((this.ReadByte() << 8) + this.ReadByte());
- case 3:
- return ((int)(this.ReadByte()) << 16) + ((int)(this.ReadByte()) << 8) + this.ReadByte();
- default:
- return 0;
- }
- }
- private byte ReadByte()
- {
- lock (this.m_QueueLock)
- {
- return this.m_Queue.Dequeue();
- }
- }
- private byte[] ReadBytes(int len)
- {
- byte[] result = new byte[len];
- lock (this.m_QueueLock)
- {
- for (int i = 0; i < len; i++)
- {
- result[i] = this.m_Queue.Dequeue();
- }
- return result;
- }
- }
- public int Length
- {
- get { return this.m_Queue.Count(); }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement