Example #1
0
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
}
Example #2
0
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();
}