public IEnumerable<IScsMessage> CreateMessages(byte[] receivedBytes) { var messages = new List<IScsMessage>(); // zlib compression (0x80000005) (Client sends start packet, but does not use compression?) if (receivedBytes[0] == 0x80 && receivedBytes[1] == 0x00 && receivedBytes[2] == 0x00 && receivedBytes[3] == 0x05) { //Console.WriteLine("Skipping zlib packet"); return messages; } if (_backBuffer != null) { _stream = new PacketStream(); _stream.Write(_backBuffer, 0, _backBuffer.Length); _stream.Write(receivedBytes, 0, receivedBytes.Length); _backBuffer = null; } else _stream = new ConanStream(receivedBytes); while (ReadMessage(messages)) ; return messages; }
public IEnumerable <IScsMessage> CreateMessages(byte[] receivedBytes) { var messages = new List <IScsMessage>(); // zlib compression (0x80000005) (Client sends start packet, but does not use compression?) if (receivedBytes[0] == 0x80 && receivedBytes[1] == 0x00 && receivedBytes[2] == 0x00 && receivedBytes[3] == 0x05) { //Console.WriteLine("Skipping zlib packet"); return(messages); } if (_backBuffer != null) { _stream = new PacketStream(); _stream.Write(_backBuffer, 0, _backBuffer.Length); _stream.Write(receivedBytes, 0, receivedBytes.Length); _backBuffer = null; } else { _stream = new ConanStream(receivedBytes); } while (ReadMessage(messages)) { ; } return(messages); }
public static void TrimStream(ref ConanStream stream) { if (stream.Position == stream.Length) { stream = new PacketStream(); return; } var remaining = new byte[stream.Length - stream.Position]; stream.Read(remaining, 0, remaining.Length); stream = new ConanStream(remaining); }
public IEnumerable<IScsMessage> CreateMessages(byte[] receivedBytes) { var messages = new List<IScsMessage>(); if (_backBuffer != null) { _stream = new PacketStream(); _stream.Write(_backBuffer, 0, _backBuffer.Length); _stream.Write(receivedBytes, 0, receivedBytes.Length); _backBuffer = null; } else _stream = new ConanStream(receivedBytes); while (ReadMessage(messages)) ; return messages; }
public ConanPacket(ConanStream stream) { _originalStream = stream; stream.Position = 0; Length = stream.ReadUInt32(); if (Length == 0 || stream.Length < Length) { //throw new Exception("stream.Length < length"); Length = UInt32.MaxValue; return; } Crc32 = stream.ReadUInt32(); Headersize = stream.ReadUInt32(); if (Headersize > 0xffff) // this should do.. { //throw new Exception("Headersize > 0xffff"); Length = UInt32.MaxValue; return; } Sender = stream.ReadByte(); SenderInt = stream.ReadArrayPrependLengthByte(); Receiver = stream.ReadByte(); ReceiverInt = stream.ReadArrayPrependLengthByte(); Opcode = stream.ReadUInt16(); var checkHeaderLength = Headersize - (UInt32)(sizeof(UInt32) + SenderInt.Length + ReceiverInt.Length); if (checkHeaderLength > 0) { HeaderData = new ConanStream(stream.ReadArray(checkHeaderLength - sizeof(byte) * 2)); } var dataLength = Length - (Headersize + sizeof(UInt32) * 2); if (dataLength > 0) { Data = new ConanStream(stream.ReadArray(dataLength)); } }
public AgentServerPacket(ConanStream stream) { _originalStream = stream; stream.Position = 0; Opcode = stream.ReadUInt16(); Length = stream.ReadUInt16(); if (Length == 0 || stream.Length < Length) { //throw new Exception("stream.Length < length"); Length = UInt16.MaxValue; return; } Data = new ConanStream(stream.ReadArray(Length - sizeof (UInt16)*2u)); Console.WriteLine(); }
public ConanPacket(ConanStream stream) { _originalStream = stream; stream.Position = 0; Length = stream.ReadUInt32(); if (Length == 0 || stream.Length < Length) { //throw new Exception("stream.Length < length"); Length = UInt32.MaxValue; return; } Crc32 = stream.ReadUInt32(); Headersize = stream.ReadUInt32(); if (Headersize > 0xffff) // this should do.. { //throw new Exception("Headersize > 0xffff"); Length = UInt32.MaxValue; return; } Sender = stream.ReadByte(); SenderInt = stream.ReadArrayPrependLengthByte(); Receiver = stream.ReadByte(); ReceiverInt = stream.ReadArrayPrependLengthByte(); Opcode = stream.ReadUInt16(); var checkHeaderLength = Headersize - (UInt32) (sizeof (UInt32) + SenderInt.Length + ReceiverInt.Length); if (checkHeaderLength > 0) HeaderData = new ConanStream(stream.ReadArray(checkHeaderLength - sizeof (byte)*2)); var dataLength = Length - (Headersize + sizeof (UInt32)*2); if (dataLength > 0) Data = new ConanStream(stream.ReadArray(dataLength)); }
public static unsafe UInt32 CalculateForPacketBuffer(ConanStream packetBuffer) { fixed (byte* fix = packetBuffer.GetBuffer()) { var buffer = (UInt32*) fix + 2; // skip length and hash var len = packetBuffer.Length - sizeof (UInt32)*2; var crc32 = 0xffffffff; UInt32 offset = 0; if (len >= 32) { for (UInt32 i = 0; i < len >> 5; i++) { crc32 ^= buffer[offset]; len -= 4; for (UInt32 ii = 0; ii < 7; ii++) { offset++; crc32 = CrcTab2[crc32 >> 16 & 0xFF] ^ CrcTab3[crc32 >> 8 & 0xFF] ^ CrcTab1[crc32 >> 24] ^ CrcTab4[crc32 & 0xFF] ^ buffer[offset]; len -= 4; } crc32 = CrcTab2[crc32 >> 16 & 0xFF] ^ CrcTab3[crc32 >> 8 & 0xFF] ^ CrcTab1[crc32 >> 24] ^ CrcTab4[crc32 & 0xFF]; offset++; } } if (len >= offset) { for (UInt32 i = 0; i < (len >> 2); i++) { crc32 ^= buffer[offset]; len -= 4; crc32 = CrcTab2[crc32 >> 16 & 0xFF] ^ CrcTab3[crc32 >> 8 & 0xFF] ^ CrcTab1[crc32 >> 24] ^ CrcTab4[crc32 & 0xFF]; offset++; } } if (len > 0) { offset *= 4; for (UInt32 i = 0; i < len; i++) { var tmp = *(byte*) ((UInt64) buffer + offset); crc32 = (crc32 >> 8) ^ CrcTab1[(tmp ^ crc32) & 0xFF]; offset++; } } return crc32 ^ 0xFFFFFFFF; } }
public ConanStream WriteArrayPrependLengthUInt32(ConanStream stream) => WriteArrayPrependLengthUInt32(stream.ToArray());
public ConanStream WriteArrayPrependLengthUInt16(ConanStream stream, bool removeLen = false) => WriteArrayPrependLengthUInt16(stream.ToArray(), removeLen);
public ConanStream WriteArrayPrependLengthByte(ConanStream stream) => WriteArrayPrependLengthByte(stream.ToArray());
public ConanStream WriteArrayPrependLengthUInt32(ConanStream stream) => WriteArrayPrependLengthUInt32(stream.ToArray());
public ConanStream WriteArrayPrependLengthUInt16(ConanStream stream, bool removeLen = false) => WriteArrayPrependLengthUInt16(stream.ToArray(), removeLen);
public ConanStream WriteArrayPrependLengthByte(ConanStream stream) => WriteArrayPrependLengthByte(stream.ToArray());