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); }