コード例 #1
0
ファイル: Client.cs プロジェクト: destrofer/IGE.Net
        private void SendNonBlocking(Packet packet)
        {
            PacketEncryptionMethod encryption = packet.Encryption;

            lock (SyncSend) {
                if (m_WriterStream == null || !Connected)
                {
                    throw new IOException("Client is not connected");
                }

                IgeNetStream stream = (IgeNetStream)m_WriterStream.BaseStream;

                if (GameDebugger.MinNetLogLevel <= LogLevel.VerboseDebug)
                {
                    Log(LogLevel.VerboseDebug, "Sending packet: '{0}'. Packet contents: {1}", packet.GetType().FullName, packet.ToString());
                }
                else
                {
                    Log(LogLevel.Debug, "Sending packet: '{0}'", packet.GetType().FullName);
                }

                // Log(LogLevel.Debug, "Resetting send checksum");
                // stream.ResetWriteChecksum();

                //Thread.MemoryBarrier();

                Log(LogLevel.Debug, "Sending packet id: 0x{0:X8}", packet.Id);
                m_WriterStream.Write(packet.Id);

                switch (encryption)
                {
                case PacketEncryptionMethod.RSA: {
                    Log(LogLevel.Debug, "Serializing packet to a RSA encrypted block");
                    using (BinaryWriter cryptoWriter = new BinaryWriter(new MemoryStream(), Encoding.Unicode)) {
                        packet.Serialize(cryptoWriter);
                        byte[] cryptoData = m_RSACryptoPublic.Encrypt(((MemoryStream)cryptoWriter.BaseStream).ToArray(), false);
                        Log(LogLevel.Debug, "Encrypted serialized block size: {0}", cryptoData.Length);
                        m_WriterStream.Write(cryptoData.Length);
                        m_WriterStream.Write(cryptoData);
                    }
                    break;
                }

                case PacketEncryptionMethod.Rijndael: {
                    Log(LogLevel.Debug, "Serializing packet to a Rijndael crypto stream");
                    using (MemoryStream mem = new MemoryStream()) {
                        using (BinaryWriter cryptoWriter = new BinaryWriter(new CryptoStream(mem, m_RijCrypto.CreateEncryptor(), CryptoStreamMode.Write), Encoding.Unicode)) {
                            packet.Serialize(cryptoWriter);
                        }
                        byte[] cryptoData = mem.ToArray();
                        Log(LogLevel.Debug, "Encrypted serialized block size: {0}", cryptoData.Length);
                        m_WriterStream.Write(cryptoData.Length);
                        m_WriterStream.Write(cryptoData);
                    }
                    break;
                }

                default: {
                    Log(LogLevel.Debug, "Serializing packet to a write stream");
                    packet.Serialize(m_WriterStream);
                    break;
                }
                }

                uint checksum = stream.WriteChecksum ^ unchecked (m_SendPacketSerial++);

                //Thread.MemoryBarrier();

                Log(LogLevel.Debug, "Sending checksum: 0x{0:X8}", checksum);
                m_WriterStream.Write(checksum);

                //Thread.MemoryBarrier();

                Log(LogLevel.Debug, "Packet sending done");
            }
        }
コード例 #2
0
ファイル: PacketAttribute.cs プロジェクト: destrofer/IGE.Net
 public PacketAttribute(uint packet_id, PacketEncryptionMethod encryption)
 {
     m_PacketId   = packet_id;
     m_Encryption = encryption;
 }
コード例 #3
0
 public PacketRegistryEntry(uint id, Type type, PacketEncryptionMethod encryption)
 {
     m_Id         = id;
     m_Type       = type;
     m_Encryption = encryption;
 }