bool CClient::addRelay( const CServerDef * pServ ) { ADDTOCALLSTACK("CClient::addRelay"); EXC_TRY("addRelay"); // Tell the client to play on this server. if ( !pServ ) return false; CSocketAddressIP ipAddr = pServ->m_ip; if ( ipAddr.IsLocalAddr()) // local server address not yet filled in. { ipAddr = m_net->m_socket.GetSockName(); DEBUG_MSG(( "%x:Login_Relay to %s\n", GetSocketID(), ipAddr.GetAddrStr() )); } if ( GetPeer().IsLocalAddr() || GetPeer().IsSameIP( ipAddr )) // weird problem with client relaying back to self. { DEBUG_MSG(( "%x:Login_Relay loopback to server %s\n", GetSocketID(), ipAddr.GetAddrStr() )); ipAddr.SetAddrIP( SOCKET_LOCAL_ADDRESS ); } EXC_SET("customer id"); dword dwAddr = ipAddr.GetAddrIP(); dword dwCustomerId = 0x7f000001; if ( g_Cfg.m_fUseAuthID ) { CSString sCustomerID(pServ->GetName()); sCustomerID.Add(GetAccount()->GetName()); dwCustomerId = z_crc32(0L, Z_NULL, 0); dwCustomerId = z_crc32(dwCustomerId, reinterpret_cast<const z_Bytef *>(sCustomerID.GetPtr()), (z_uInt)sCustomerID.GetLength()); GetAccount()->m_TagDefs.SetNum("customerid", dwCustomerId); } DEBUG_MSG(( "%x:Login_Relay to server %s with AuthId %u\n", GetSocketID(), ipAddr.GetAddrStr(), dwCustomerId )); EXC_SET("server relay packet"); new PacketServerRelay(this, dwAddr, pServ->m_ip.GetPort(), dwCustomerId); m_Targ_Mode = CLIMODE_SETUP_RELAY; return true; EXC_CATCH; EXC_DEBUG_START; g_Log.EventDebug("account '%s'\n", GetAccount() ? GetAccount()->GetName() : ""); EXC_DEBUG_END; return false; }
CSocketAddress::CSocketAddress( CSocketAddressIP ip, WORD uPort ) { s_addr = ip.GetAddrIP(); m_port = uPort; }