/* ================== CL_GetPing ================== */ void CL_GetPing( int n, char *buf, int buflen, int *pingtime ) { const char *str; int time; int maxPing; if (!cl_pinglist[n].adr.port) { // empty slot buf[0] = '\0'; *pingtime = 0; return; } str = NET_AdrToString( cl_pinglist[n].adr ); strncpy( buf, str, buflen ); time = cl_pinglist[n].time; if (!time) { // check for timeout time = timeGetTime() - cl_pinglist[n].start; //maxPing = Cvar_VariableIntegerValue( "cl_maxPing" ); maxPing = 500; if (time < maxPing) { // not timed out yet time = 0; } } CL_SetServerInfoByAddress(cl_pinglist[n].adr, cl_pinglist[n].info, cl_pinglist[n].time); *pingtime = time; }
void CL_Ping_f( void ) { netadr_t to; ping_t* pingptr; char* server; if ( Cmd_Argc() != 2 ) { Com_Printf( 0, "usage: ping [server]\n"); return; } memset( &to, 0, sizeof(netadr_t) ); server = Cmd_Argv(1); if ( !NET_StringToAdr( server, &to ) ) { return; } pingptr = CL_GetFreePing(); memcpy( &pingptr->adr, &to, sizeof (netadr_t) ); pingptr->start = timeGetTime(); pingptr->time = 0; CL_SetServerInfoByAddress(pingptr->adr, NULL, 0); NET_OutOfBandPrint( NS_CLIENT, to, "getinfo xxx" ); }
void CL_ServerInfoPacket( netadr_t from, msg_t *msg ) { int i, type; //->char info[1024]; char* str; char *infoString; //->int prot; infoString = MSG_ReadString( msg ); //infoString = msg->data; // if this isn't the correct protocol version, ignore it /*prot = atoi( Info_ValueForKey( infoString, "protocol" ) ); if ( prot != 144 ) { Com_DPrintf( "Different protocol info packet: %s\n", infoString ); return; }*/ const char* challenge = Info_ValueForKey(infoString, "challenge"); if (challenge && !_strnicmp("_join", challenge, 5)) { CL_JoinResponse(from, infoString); } // iterate servers waiting for ping response for (i=0; i<MAX_PINGREQUESTS; i++) { if ( cl_pinglist[i].adr.port && !cl_pinglist[i].time && NET_CompareAdr( from, cl_pinglist[i].adr ) ) { // calc ping time cl_pinglist[i].time = timeGetTime() - cl_pinglist[i].start + 1; //Com_Printf( 0, "ping time %dms from %s\n", cl_pinglist[i].time, NET_AdrToString( from ) ); // save of info strncpy( cl_pinglist[i].info, infoString, sizeof( cl_pinglist[i].info ) ); // tack on the net type // NOTE: make sure these types are in sync with the netnames strings in the UI switch (from.type) { case NA_BROADCAST: case NA_IP: str = "udp"; type = 1; break; default: str = "???"; type = 0; break; } Info_SetValueForKey( cl_pinglist[i].info, "nettype", va("%d", type) ); CL_SetServerInfoByAddress(from, infoString, cl_pinglist[i].time); return; } } }
void CL_Ping_f() { if ( Cmd_Argc() != 2 ) { Com_Printf( "usage: ping [server]\n"); return; } netadr_t to; const char* server = Cmd_Argv(1); if ( !NET_StringToAdr( server, &to ) ) return; ping_t* pingptr = CL_GetFreePing(); memcpy( &pingptr->adr, &to, sizeof (netadr_t) ); pingptr->start = cls.realtime; pingptr->time = 0; CL_SetServerInfoByAddress(pingptr->adr, NULL, 0); NET_OutOfBandPrint( NS_CLIENT, to, "getinfo xxx" ); }
/* =================== CL_ServerInfoPacket =================== */ void CL_ServerInfoPacket( netadr_t from, msg_t *msg ) { int i, type; char info[MAX_INFO_STRING]; char *infoString; int prot; infoString = MSG_ReadString( msg ); // if this isn't the correct protocol version, ignore it prot = atoi( Info_ValueForKey( infoString, "protocol" ) ); if ( prot != PROTOCOL_VERSION ) { Com_DPrintf( "Different protocol info packet: %s\n", infoString ); return; } // iterate servers waiting for ping response for (i=0; i<MAX_PINGREQUESTS; i++) { if ( cl_pinglist[i].adr.port && !cl_pinglist[i].time && NET_CompareAdr( from, cl_pinglist[i].adr ) ) { // calc ping time cl_pinglist[i].time = cls.realtime - cl_pinglist[i].start + 1; Com_DPrintf( "ping time %dms from %s\n", cl_pinglist[i].time, NET_AdrToString( from ) ); // save of info Q_strncpyz( cl_pinglist[i].info, infoString, sizeof( cl_pinglist[i].info ) ); // tack on the net type // NOTE: make sure these types are in sync with the netnames strings in the UI switch (from.type) { case NA_BROADCAST: case NA_IP: type = 1; break; default: type = 0; break; } Info_SetValueForKey( cl_pinglist[i].info, "nettype", va("%d", type) ); CL_SetServerInfoByAddress(from, infoString, cl_pinglist[i].time); return; } } // if not just sent a local broadcast or pinging local servers if (cls.pingUpdateSource != AS_LOCAL) { return; } for ( i = 0 ; i < MAX_OTHER_SERVERS ; i++ ) { // empty slot if ( cls.localServers[i].adr.port == 0 ) { break; } // avoid duplicate if ( NET_CompareAdr( from, cls.localServers[i].adr ) ) { return; } } if ( i == MAX_OTHER_SERVERS ) { Com_DPrintf( "MAX_OTHER_SERVERS hit, dropping infoResponse\n" ); return; } // add this to the list cls.numlocalservers = i+1; cls.localServers[i].adr = from; cls.localServers[i].clients = 0; cls.localServers[i].hostName[0] = '\0'; cls.localServers[i].mapName[0] = '\0'; cls.localServers[i].maxClients = 0; cls.localServers[i].maxPing = 0; cls.localServers[i].minPing = 0; cls.localServers[i].ping = -1; cls.localServers[i].game[0] = '\0'; cls.localServers[i].gameType = 0; cls.localServers[i].netType = from.type; cls.localServers[i].punkbuster = 0; Q_strncpyz( info, MSG_ReadString( msg ), MAX_INFO_STRING ); if (info[0]) { if (info[strlen(info)-1] != '\n') { strncat(info, "\n", sizeof(info)); } Com_Printf( "%s: %s", NET_AdrToString( from ), info ); } }