Пример #1
0
        public STUNAddress ReadMappedAddress(NetworkPacket packet)
        {
            STUNAddress sa         = new STUNAddress();
            ushort      attrLength = packet.ReadUShort();
            byte        empty      = packet.ReadByte();

            sa.family = packet.ReadByte();
            sa.port   = packet.ReadUShort();

            switch (sa.family)
            {
            case 1:
                sa.address = new byte[4];
                break;

            case 2:
                sa.address = new byte[16];
                break;
            }

            for (int i = 0; i < sa.address.Length; i++)
            {
                sa.address[i] = packet.ReadByte();
            }
            return(sa);
        }
Пример #2
0
        public STUNAddress ReadXorMappedAddress(NetworkPacket packet)
        {
            STUNAddress sa         = new STUNAddress();
            ushort      attrLength = packet.ReadUShort();
            ushort      xorFlag16  = (ushort)(magicCookie >> 16);
            byte        empty      = packet.ReadByte();

            sa.family = packet.ReadByte();
            sa.port   = (ushort)(packet.ReadUShort() ^ xorFlag16);

            switch (sa.family)
            {
            case 1:
                byte[] xorFlagBytes = new byte[4];
                Array.Copy(packet.ByteBuffer, 4, xorFlagBytes, 0, 4);
                Array.Reverse(xorFlagBytes);
                uint xorFlag32 = BitConverter.ToUInt32(xorFlagBytes, 0);

                sa.address = new byte[4];
                uint address = packet.ReadUInt() ^ xorFlag32;
                sa.address[0] = (byte)((address & 0xff000000) >> 24);
                sa.address[1] = (byte)((address & 0x00ff0000) >> 16);
                sa.address[2] = (byte)((address & 0x0000ff00) >> 8);
                sa.address[3] = (byte)(address & 0x000000ff);
                break;

            case 2:
                sa.address = new byte[16];
                byte[] xorFlags = new byte[16];
                Array.Copy(transactionID, 0, xorFlags, xorFlags.Length, transactionID.Length);
                for (int i = 0; i < sa.address.Length; i++)
                {
                    sa.address[i] = (byte)(packet.ReadByte() ^ xorFlags[i]);
                }
                break;
            }

            return(sa);
        }