static void BeginReceiveClientCallback(IAsyncResult ar) { try { if (_clientSocket == null) { return; } var count = _clientSocket.EndReceive(ar); if (count <= 0) { return; } var size = (uint)BitConverter.ToUInt16(_clientBuffer, 0) + 2; while (count < size) { var read = _clientSocket.Receive(_clientBuffer, count, (int)(size - count), SocketFlags.None); if (read <= 0) { throw new Exception("Client connection broken."); } count += read; } var message = new NetworkMessage(_client); message.Seek(0, SeekOrigin.Begin); message.Write(_clientBuffer); var rsaStartIndex = _client.VersionNumber >= 124010030 ? 31 : 18; var rsa = new Rsa(); rsa.OpenTibiaDecrypt(message, rsaStartIndex); message.Seek(rsaStartIndex, SeekOrigin.Begin); if (message.ReadByte() != 0) { throw new Exception("RSA decryption failed."); } _xteaKey = new uint[4]; for (var i = 0; i < 4; ++i) { _xteaKey[i] = message.ReadUInt32(); } _clientSendThread = new Thread(new ThreadStart(PlayRecording)); _clientSendThread.Start(); } catch (Exception ex) { Console.WriteLine(ex); } }