private void Receive(IAsyncResult ar) { var receivedBytes = 0; try { receivedBytes = _socket.EndReceive(ar); } catch (Exception ex) { Disconnect($"Receive Exception: {ex}"); } // Check if the socket was closed. if (receivedBytes == 0) { Disconnect(); return; } // Check the message header. if (receivedBytes < InHeaderSize) { Disconnect("The received packets header size is incorrect."); return; } // TODO Properly Process incomming bytes. using (var stream = new MemoryStream(_receiveBuffer, 0, receivedBytes)) using (var reader = new BinaryReader(stream)) { var size = reader.ReadUInt16(); var encrypted = reader.ReadByte() == 1; var body = reader.ReadBytes(size - InHeaderSize); if (encrypted) { body = BDOCrypt.Xor(body, 0, body.Length); } using (var messageStream = new MemoryStream(body)) using (var message = new BinaryReader(messageStream)) { var messageId = message.ReadUInt16(); // MessageId Logging.Server($"Received(Size:{size}, Encrypted: {encrypted}, MessageId: {messageId}, 0x{messageId:X2})"); //Logging.Server(BufferExtensions.ToHex(body.Skip(2).ToArray())); var handler = MessageTable.FindMessageHandler(messageId); if (handler != null) { handler.Handle(this, message); } else { Logging.Server($"Unknown Message Received: Size:{size}, Encrypted: {encrypted}, MessageId: {messageId} (0x{messageId:X2})"); Logging.Server(BufferExtensions.ToHex(body.Skip(2).ToArray())); } } } // Start receiving more data. BeginReceive(); }