Beispiel #1
0
        public void Send(PacketOut packet)
        {
            try
            {
                if (!Connected)
                {
                    return;
                }
                Log.WriteLine(LogType.Network, "Sending packet: {0}", packet.packetId);
                if (!Connected)
                {
                    return;
                }
                Byte[] Data = packet.ToArray();

                int    Length = Data.Length;
                byte[] Packet = new byte[2 + Length];
                Packet[0] = (byte)(Length >> 8);
                Packet[1] = (byte)(Length & 0xff);
                Data.CopyTo(Packet, 2);
                mCrypt.Encrypt(Packet, 0, 6);
                //While writing this part of code I had a strange feeling of Deja-Vu or whatever it's called :>

                Log.WriteLine(LogType.Packet, "{0}", packet.ToHex());
                mSocket.Send(Packet);
            }
            catch (Exception ex)
            {
                Log.WriteLine(LogType.Error, "Exception Occured");
                Log.WriteLine(LogType.Error, "Message: {0}", ex.Message);
                Log.WriteLine(LogType.Error, "Stacktrace: {0}", ex.StackTrace);
            }
        }
Beispiel #2
0
 /// <summary>Encrypts the byte array</summary>
 /// <param name="data">The raw packet data to encrypt</param>
 private void Encrypt(byte[] data, int offset)
 {
     if (Interlocked.Exchange(ref encrypt, 1) == 1)
     {
         log.Error("Encrypt Error");
     }
     m_packetCrypt.Encrypt(data, offset, 4);
     Interlocked.Exchange(ref encrypt, 0);
 }
Beispiel #3
0
        /// <summary>
        /// Enqueue <see cref="IWritable"/> to be sent encrypted to the client.
        /// </summary>
        public void EnqueueMessageEncrypted(IWritable message)
        {
            if (!MessageManager.GetOpcode(message, out GameMessageOpcode opcode))
            {
                log.Warn("Failed to send message with no attribute!");
                return;
            }

            using (var stream = new MemoryStream())
                using (var writer = new GamePacketWriter(stream))
                {
                    writer.Write(opcode, 16);
                    message.Write(writer);
                    writer.FlushBits();

                    byte[] data      = stream.ToArray();
                    byte[] encrypted = encryption.Encrypt(data, data.Length);
                    EnqueueMessage(BuildEncryptedMessage(encrypted));
                }

            log.Trace($"Sent packet {opcode}(0x{opcode:X}).");
        }
Beispiel #4
0
        public void Send(ref PacketWriter packet)
        {
            if (packet.Opcode == 0)
            {
                return;
            }

            var buffer = packet.ReadDataToSend();

            try
            {
                if (Crypt.IsInitialized)
                {
                    uint totalLength = (uint)packet.Size - 2;
                    totalLength <<= 13;
                    totalLength  |= ((uint)packet.Opcode & 0x1FFF);

                    var header = BitConverter.GetBytes(totalLength);

                    Crypt.Encrypt(header);

                    buffer[0] = header[0];
                    buffer[1] = header[1];
                    buffer[2] = header[2];
                    buffer[3] = header[3];
                }

                clientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);

                string clientInfo = ((IPEndPoint)clientSocket.RemoteEndPoint).Address + ":" + ((IPEndPoint)clientSocket.RemoteEndPoint).Port;
                PacketLog.WritePacket(clientInfo, packet);

                packet.Flush();
            }
            catch (Exception ex)
            {
                Log.Message(LogType.ERROR, "{0}", ex.Message);
                Log.Message();

                clientSocket.Close();
            }
        }