public static PWStream[] FromBuff(byte[] buff)
            {
                List <PWStream> result = new List <PWStream>();

                ushort length;

                for (int i = 0; i < buff.Length; i += length)
                {
                    ushort header;
                    int    len  = 4;
                    int    _len = buff.Length - i;
                    if (_len < len) //Не хватает места
                    {
                        len = _len;
                    }
                    using (MemoryStream ms = new MemoryStream(buff, i, len))
                    {
                        header = new CompactUInt16(ms);
                        length = new CompactUInt16(ms);
                        i     += (int)ms.Position;
                    }

                    PWStream pw = new PWStream(buff, i, length);
                    pw.Header      = header;
                    pw.IsContainer = false;
                    result.Add(pw);
                }
                return(result.ToArray());
            }
Example #2
0
        private void socket_Receive(object obj, SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success || e.BytesTransferred == 0)
            {
                IsDisconnected = true;
                if (Disconnected != null)
                {
                    Disconnected();
                }
                return;
            }

            byte[] buff = GetArray(e.Buffer, 0, e.BytesTransferred);

            if (IsLoginCompleted)
            {
                crypt.Decrypt(ref buff);
            }

            //Начинаем обработку входящих данных
            lock (Wrapper)
            {
                var cont1 = PWStream.FromBuff(buff);
                foreach (var elm1 in cont1)
                {
                    if (elm1.Header == 0x00)
                    {
                        var cont2 = PWStream.FromContainer(elm1);
                        foreach (var elm2 in cont2)
                        {
                            p(elm2);
                        }
                    }
                    else
                    {
                        p(elm1);
                    }
                }
            }
            socket.ReceiveAsync(socketRAEA);
        }
            public static PWStream[] FromContainer(PWStream c) //Container
            {
                c.IsContainer = true;
                List <PWStream> result = new List <PWStream>();
                ushort          length;

                for (; c.Position < c.Length;)
                {
                    byte _header = c.ReadByte();
                    if (_header != 0x22) //Не ешё один контейнер
                    {
                        throw new ArgumentException();
                    }

                    length = c.ReadFullCompactUInt16();
                    if (length < 0x80)
                    {
                        length -= 1;
                    }
                    else
                    {
                        c.ReadByte(2); //мусор
                        length -= 2;
                    }

                    ushort header = c.ReadUInt16();

                    length -= 2; //ushort = 2bt

                    PWStream pw = new PWStream(c.ms, length);
                    pw.Header      = header;
                    pw.IsContainer = true;
                    result.Add(pw);
                }
                return(result.ToArray());
            }