예제 #1
0
        public DataFragment(byte[] fragment)
        {
            _fragment = fragment;

            _head          = (FragmentHead)_fragment[0];
            Opcode         = (FragmentOpcode)(_fragment[0] & _opcodeMask);
            Masked         = (_fragment[1] & _maskFlagMask) != 0;
            _hasMaskingKey = Masked;

            CalculateLengthAndPositions();
        }
예제 #2
0
        public static DataFragment Create(byte[] payload, FragmentHead head, FragmentOpcode opcode, bool mask)
        {
            var payloadLength = payload.Length;
            var lengthBytes   = new List <byte>();

            if (payloadLength < 126)
            {
                lengthBytes.Add((byte)payloadLength);
            }
            else if (payloadLength < ushort.MaxValue)
            {
                lengthBytes.Add(126);
                var lbytes = BitConverter.GetBytes((ushort)payloadLength);
                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(lbytes);
                }

                lengthBytes.AddRange(lbytes);
            }
            else
            {
                lengthBytes.Add(127);
                var lbytes = BitConverter.GetBytes((ulong)payloadLength);
                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(lbytes);
                }

                lengthBytes.AddRange(lbytes);
            }

            byte[] maskingKey = new byte[0];
            if (mask)
            {
                var rnd = new Random();
                maskingKey = new byte[4];
                rnd.NextBytes(maskingKey);
                ToggleMasking(payload, 0, maskingKey);
                lengthBytes[0] = (byte)(lengthBytes[0] + _maskFlagMask);
            }

            var bytes = new List <byte>();

            bytes.Add((byte)((byte)head + (byte)opcode));
            bytes.AddRange(lengthBytes);
            bytes.AddRange(maskingKey);
            bytes.AddRange(payload);

            return(new DataFragment(bytes.ToArray()));
        }
예제 #3
0
파일: Packet.cs 프로젝트: sbennington/ACE
        public ServerPacketFragment(ushort group, FragmentOpcode opcode = FragmentOpcode.None)
        {
            Opcode = opcode;

            Data    = new MemoryStream((int)MaxFragmentDataSize);
            Payload = new BinaryWriter(Data);
            Header  = new PacketFragmentHeader()
            {
                Group = group
            };

            if (opcode != FragmentOpcode.None)
            {
                Payload.Write((uint)opcode);
            }
        }
예제 #4
0
 public FragmentAttribute(FragmentOpcode opcode)
 {
     Opcode = opcode;
 }
예제 #5
0
 public FragmentAttribute(FragmentOpcode opcode, SessionState state)
 {
     Opcode = opcode;
     State  = state;
 }