/// <summary>
/// Returns true if message should be dropped
/// </summary>
internal bool HandleNATIntroduction(IncomingNetMessage message)
{
if (message.m_type == NetMessageLibraryType.System)
{
if (message.m_data.LengthBytes > 4 && message.m_data.PeekByte() == (byte)NetSystemType.NatIntroduction)
{
if ((m_enabledMessageTypes & NetMessageType.NATIntroduction) != NetMessageType.NATIntroduction)
{
return(true); // drop
}
try
{
message.m_data.ReadByte(); // step past system type byte
IPEndPoint presented = message.m_data.ReadIPEndPoint();
LogVerbose("Received NATIntroduction to " + presented + "; sending punching ping...");
double now = NetTime.Now;
NetConnection.SendPing(this, presented, now);
if (m_holePunches == null)
{
m_holePunches = new List <IPEndPoint>();
}
for (int i = 0; i < 5; i++)
{
m_holePunches.Add(new IPEndPoint(presented.Address, presented.Port));
}
NetBuffer info = CreateBuffer();
info.Write(presented);
NotifyApplication(NetMessageType.NATIntroduction, info, message.m_sender, message.m_senderEndPoint);
return(true);
}
catch (Exception ex)
{
NotifyApplication(NetMessageType.BadMessageReceived, "Bad NAT introduction message received: " + ex.Message, message.m_sender, message.m_senderEndPoint);
return(true);
}
}
}
return(false);
}