Exemple #1
0
        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);
            }
        }