Exemple #1
0
        public static NatNegMessage ParseData(byte[] bytes)
        {
            if (bytes.Length < 8)
            {
                return(null);
            }
            if (bytes[0] != 0xFD || bytes[1] != 0xFC)
            {
                return(null);
            }
            NatNegMessage msg = new NatNegMessage();

            msg.Constant        = _toInt(_getBytes(bytes, 2, 4));
            msg.ProtocolVersion = bytes[6];
            msg.RecordType      = bytes[7];
            if (bytes.Length > 8)
            {
                msg.RecordSpecificData = _getBytes(bytes, 8, bytes.Length - 8);
            }
            if (msg.RecordType == 0)
            {
                // INIT
                msg.ClientId         = _toInt(_getBytes(msg.RecordSpecificData, 0, 4));
                msg.SequenceId       = msg.RecordSpecificData[4];
                msg.Hoststate        = msg.RecordSpecificData[5];
                msg.UseGamePort      = msg.RecordSpecificData[6];
                msg.PrivateIPAddress = _toIpAddress(_getBytes(msg.RecordSpecificData, 7, 4));
                msg.LocalPort        = _toShort(_getBytes(msg.RecordSpecificData, 11, 2));
                msg.GameName         = _toString(_getBytes(msg.RecordSpecificData, 13, msg.RecordSpecificData.Length - 13));
            }
            else if (msg.RecordType == 6)
            {
                // CONNECT_ACK
                msg.ClientId           = _toInt(_getBytes(msg.RecordSpecificData, 0, 4));
                msg.PortType           = msg.RecordSpecificData[4];
                msg.ReplyFlag          = msg.RecordSpecificData[5];
                msg.ConnectAckUnknown2 = _toShort(_getBytes(msg.RecordSpecificData, 6, 2));
                msg.ConnectAckUnknown3 = msg.RecordSpecificData[8];
                msg.ConnectAckUnknown4 = _toInt(_getBytes(msg.RecordSpecificData, 9, 4));
            }
            else if (msg.RecordType == 13)
            {
                // CONNECT_ACK
                msg.ClientId         = _toInt(_getBytes(msg.RecordSpecificData, 0, 4));
                msg.PortType         = msg.RecordSpecificData[4];
                msg.Hoststate        = msg.RecordSpecificData[5];
                msg.NatNegResult     = msg.RecordSpecificData[6];
                msg.NatType          = _toIntBigEndian(_getBytes(msg.RecordSpecificData, 7, 4));
                msg.NatMappingScheme = _toIntBigEndian(_getBytes(msg.RecordSpecificData, 11, 4));
                msg.GameName         = _toString(_getBytes(msg.RecordSpecificData, 15, msg.RecordSpecificData.Length - 15));
            }
            return(msg);
        }
 public static NatNegMessage ParseData(byte[] bytes)
 {
     if (bytes.Length < 8) return null;
     if (bytes[0] != 0xFD || bytes[1] != 0xFC) return null;
     NatNegMessage msg = new NatNegMessage();
     msg.Constant = _toInt(_getBytes(bytes, 2, 4));
     msg.ProtocolVersion = bytes[6];
     msg.RecordType = bytes[7];
     if (bytes.Length > 8) msg.RecordSpecificData = _getBytes(bytes, 8, bytes.Length - 8);
     if (msg.RecordType == 0)
     {
         // INIT
         msg.ClientId =  _toInt(_getBytes(msg.RecordSpecificData, 0, 4));
         msg.SequenceId = msg.RecordSpecificData[4];
         msg.Hoststate = msg.RecordSpecificData[5];
         msg.UseGamePort = msg.RecordSpecificData[6];
         msg.PrivateIPAddress = _toIpAddress(_getBytes(msg.RecordSpecificData, 7, 4));
         msg.LocalPort = _toShort(_getBytes(msg.RecordSpecificData, 11, 2));
         msg.GameName = _toString(_getBytes(msg.RecordSpecificData, 13, msg.RecordSpecificData.Length-13));
     }
     else if (msg.RecordType == 6)
     {
         // CONNECT_ACK
         msg.ClientId = _toInt(_getBytes(msg.RecordSpecificData, 0, 4));
         msg.PortType = msg.RecordSpecificData[4];
         msg.ReplyFlag = msg.RecordSpecificData[5];
         msg.ConnectAckUnknown2 = _toShort(_getBytes(msg.RecordSpecificData, 6, 2));
         msg.ConnectAckUnknown3 = msg.RecordSpecificData[8];
         msg.ConnectAckUnknown4 = _toInt(_getBytes(msg.RecordSpecificData, 9, 4));
     }
     else if (msg.RecordType == 13)
     {
         // CONNECT_ACK
         msg.ClientId = _toInt(_getBytes(msg.RecordSpecificData, 0, 4));
         msg.PortType = msg.RecordSpecificData[4];
         msg.Hoststate = msg.RecordSpecificData[5];
         msg.NatNegResult = msg.RecordSpecificData[6];
         msg.NatType = _toIntBigEndian(_getBytes(msg.RecordSpecificData, 7, 4));
         msg.NatMappingScheme = _toIntBigEndian(_getBytes(msg.RecordSpecificData, 11, 4));
         msg.GameName = _toString(_getBytes(msg.RecordSpecificData, 15, msg.RecordSpecificData.Length - 15));
     }
     return msg;
 }
 private void SendResponse(IPEndPoint remote, NatNegMessage message)
 {
     byte[] response = message.ToBytes();
     Log(Category, "Sending response " + message.ToString() + " to " + remote.ToString());
     Log(Category, "(Response bytes: " + string.Join(" ", response.Select((b) => { return b.ToString("X2"); }).ToArray()) + ")");
     _socket.SendTo(response, remote);
 }