void C4Network2ClientList::HandlePacket(char cStatus, const C4PacketBase *pBasePkt, C4Network2IOConnection *pConn) { // find associated client C4Network2Client *pClient = GetClient(pConn); if (!pClient) return; #define GETPKT(type, name) \ assert(pBasePkt); \ const type &name = /*dynamic_cast*/ static_cast<const type &>(*pBasePkt); switch (cStatus) { case PID_Addr: // address propagation { GETPKT(C4PacketAddr, rPkt) // find client pClient = GetClientByID(rPkt.getClientID()); if (pClient) { C4Network2Address addr = rPkt.getAddr(); // IP zero? Set to IP from where the packet came if (addr.isIPNull()) addr.SetIP(pConn->getPeerAddr().sin_addr); // add (no announce) if (pClient->AddAddr(addr, true)) // new address? Try to connect pClient->DoConnectAttempt(pIO); } } break; } #undef GETPKT }
void C4Network2IO::OnPunch(C4NetIO::addr_t addr) { // Sanity check assert (addr.sin_family == AF_INET); if (addr.sin_family != AF_INET) return; ZeroMem(addr.sin_zero, sizeof(addr.sin_zero)); // Add for local client C4Network2Client *pLocal = ::Network.Clients.GetLocal(); if (pLocal) if (pLocal->AddAddr(C4Network2Address(addr, P_UDP), true)) ::Network.InvalidateReference(); }