X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=inline;f=netconn.c;h=53446bac14f234c359e6c250c90030eccdcad07d;hb=0e936f973c3dcb7f74691912db3ad85e8805ccf1;hp=22a4f13016e6cd2907ff3969a3c4a724cc51da4a;hpb=8ea8ee92cdbbeb593e424ae3985ac8de766bafa4;p=xonotic%2Fdarkplaces.git diff --git a/netconn.c b/netconn.c index 22a4f130..53446bac 100755 --- a/netconn.c +++ b/netconn.c @@ -89,7 +89,9 @@ cvar_t net_address = {0, "net_address", "0.0.0.0"}; //cvar_t net_netaddress_ipv6 = {0, "net_address_ipv6", "[0:0:0:0:0:0:0:0]"}; // HostCache interface -hostcache_mask_t hostcache_currentmask; +hostcache_mask_t hostcache_andmasks[HOSTCACHE_ANDMASKCOUNT]; +hostcache_mask_t hostcache_ormasks[HOSTCACHE_ORMASKCOUNT]; + hostcache_infofield_t hostcache_sortbyfield; qboolean hostcache_sortdescending; @@ -123,7 +125,7 @@ static void _HostCache_ViewSet_Remove( int index ) // returns true if A should be inserted before B static qboolean _HostCache_SortTest( hostcache_t *A, hostcache_t *B ) { - int result; // > 0 if for numbers A > B and for text if A < B + int result = 0; // > 0 if for numbers A > B and for text if A < B if( hostcache_sortbyfield == HCIF_PING ) result = A->info.ping - B->info.ping; @@ -151,56 +153,64 @@ static qboolean _HostCache_SortTest( hostcache_t *A, hostcache_t *B ) static qboolean _hc_testint( int A, hostcache_maskop_t op, int B ) { - int diff; - - diff = A - B; - switch( op ) { - case HCMO_GREATER: - if( !diff ) - return false; - case HCMO_GREATEREQUAL: - if( diff < 0 ) - return false; - break; - case HCMO_EQUAL: - if( diff ) - return false; - break; - case HCMO_LESS: - if( !diff ) - return false; - case HCMO_LESSEQUAL: - if( diff > 0 ) - return false; - break; - } - return true; + if( op == HCMO_LESS ) + return A < B; + else if( op == HCMO_LESSEQUAL ) + return A <= B; + else if( op == HCMO_EQUAL ) + return A == B; + else if( op == HCMO_GREATER ) + return A > B; + else if( op == HCMO_NOTEQUAL ) + return A != B; + else // HCMO_GREATEREQUAL + return A >= B; +} + +static qboolean _hc_teststr( const char *A, hostcache_maskop_t op, const char *B ) +{ + if( op == HCMO_CONTAINS ) // A info B mask + return *B && !!strstr( A, B ); // we want a real bool + else if( op == HCMO_NOTCONTAIN ) + return !*B || !strstr( A, B ); + else if( op == HCMO_LESS ) + return strcmp( A, B ) < 0; + else if( op == HCMO_LESSEQUAL ) + return strcmp( A, B ) <= 0; + else if( op == HCMO_EQUAL ) + return strcmp( A, B ) == 0; + else if( op == HCMO_GREATER ) + return strcmp( A, B ) > 0; + else if( op == HCMO_NOTEQUAL ) + return strcmp( A, B ) != 0; + else // HCMO_GREATEREQUAL + return strcmp( A, B ) >= 0; } -static qboolean _HostCache_TestMask( hostcache_info_t *info ) +static qboolean _HostCache_TestMask( hostcache_mask_t *mask, hostcache_info_t *info ) { - if( !_hc_testint( info->ping, hostcache_currentmask.pingtest, hostcache_currentmask.info.ping ) ) + if( !_hc_testint( info->ping, mask->tests[HCIF_PING], mask->info.ping ) ) return false; - if( !_hc_testint( info->maxplayers, hostcache_currentmask.maxplayerstest, hostcache_currentmask.info.maxplayers ) ) + if( !_hc_testint( info->maxplayers, mask->tests[HCIF_MAXPLAYERS], mask->info.maxplayers ) ) return false; - if( !_hc_testint( info->numplayers, hostcache_currentmask.numplayerstest, hostcache_currentmask.info.numplayers ) ) + if( !_hc_testint( info->numplayers, mask->tests[HCIF_NUMPLAYERS], mask->info.numplayers ) ) return false; - if( !_hc_testint( info->protocol, hostcache_currentmask.protocoltest, hostcache_currentmask.info.protocol )) + if( !_hc_testint( info->protocol, mask->tests[HCIF_PROTOCOL], mask->info.protocol )) return false; - if( *hostcache_currentmask.info.cname - && !strstr( info->cname, hostcache_currentmask.info.cname ) ) + if( *mask->info.cname + && !_hc_teststr( info->cname, mask->tests[HCIF_CNAME], mask->info.cname ) ) return false; - if( *hostcache_currentmask.info.game - && !strstr( info->game, hostcache_currentmask.info.game ) ) + if( *mask->info.game + && !_hc_teststr( info->game, mask->tests[HCIF_GAME], mask->info.game ) ) return false; - if( *hostcache_currentmask.info.mod - && !strstr( info->mod, hostcache_currentmask.info.mod ) ) + if( *mask->info.mod + && !_hc_teststr( info->mod, mask->tests[HCIF_MOD], mask->info.mod ) ) return false; - if( *hostcache_currentmask.info.map - && !strstr( info->map, hostcache_currentmask.info.map ) ) + if( *mask->info.map + && !_hc_teststr( info->map, mask->tests[HCIF_MAP], mask->info.map ) ) return false; - if( *hostcache_currentmask.info.name - && !strstr( info->name, hostcache_currentmask.info.name ) ) + if( *mask->info.name + && !_hc_teststr( info->name, mask->tests[HCIF_NAME], mask->info.name ) ) return false; return true; } @@ -210,8 +220,15 @@ static void _HostCache_Insert( hostcache_t *entry ) int start, end, mid; if( hostcache_viewcount == HOSTCACHE_VIEWCACHESIZE ) return; - // now check whether it passes through mask - if( !_HostCache_TestMask( &entry->info ) ) + // now check whether it passes through the masks mask + for( start = 0 ; hostcache_andmasks[start].active && start < HOSTCACHE_ANDMASKCOUNT ; start++ ) + if( !_HostCache_TestMask( &hostcache_andmasks[start], &entry->info ) ) + return; + + for( start = 0 ; hostcache_ormasks[start].active && start < HOSTCACHE_ORMASKCOUNT ; start++ ) + if( _HostCache_TestMask( &hostcache_ormasks[start], &entry->info ) ) + break; + if( start == HOSTCACHE_ORMASKCOUNT || (start > 0 && !hostcache_ormasks[start].active) ) return; if( !hostcache_viewcount ) { @@ -269,11 +286,27 @@ void HostCache_RebuildViewSet(void) _HostCache_Insert( &hostcache_cache[i] ); } -void HostCache_ResetMask(void) +void HostCache_ResetMasks(void) { - memset( &hostcache_currentmask, 0, sizeof( hostcache_mask_t ) ); + memset( &hostcache_andmasks, 0, sizeof( hostcache_andmasks ) ); + memset( &hostcache_ormasks, 0, sizeof( hostcache_ormasks ) ); } +#if 0 +static void _HostCache_Test(void) +{ + int i; + for( i = 0 ; i < 1024 ; i++ ) { + memset( &hostcache_cache[hostcache_cachecount], 0, sizeof( hostcache_t ) ); + hostcache_cache[hostcache_cachecount].info.ping = rand() % 450 + 250; + dpsnprintf( hostcache_cache[hostcache_cachecount].info.name, 128, "Black's HostCache Test %i", i ); + hostcache_cache[hostcache_cachecount].finished = true; + sprintf( hostcache_cache[hostcache_cachecount].line1, "%i %s", hostcache_cache[hostcache_cachecount].info.ping, hostcache_cache[hostcache_cachecount].info.name ); + _HostCache_Insert( &hostcache_cache[hostcache_cachecount] ); + hostcache_cachecount++; + } +} +#endif void HostCache_QueryList(void) { @@ -286,34 +319,23 @@ void HostCache_QueryList(void) hostcache_viewcount = 0; hostcache_consoleoutput = false; NetConn_QueryMasters(); + + //_HostCache_Test(); } -#if 0 -static void _HostCache_PingTest(void) -{ - int i; - for( i = 0 ; i < 50 ; i++ ) { - memset( &hostcache_cache[hostcache_cachecount], 0, sizeof( hostcache_t ) ); - hostcache_cache[hostcache_cachecount].info.ping = rand() % 450; - hostcache_cache[hostcache_cachecount].finished = true; - sprintf( hostcache_cache[hostcache_cachecount].line1, "%i", hostcache_cache[hostcache_cachecount].info.ping ); - _HostCache_Insert( &hostcache_cache[hostcache_cachecount] ); - hostcache_cachecount++; - } -} -#endif - // rest int NetConn_Read(lhnetsocket_t *mysocket, void *data, int maxlength, lhnetaddress_t *peeraddress) { int length = LHNET_Read(mysocket, data, maxlength, peeraddress); int i; + if (length == 0) + return 0; if (cl_netpacketloss.integer) for (i = 0;i < cl_numsockets;i++) if (cl_sockets[i] == mysocket && (rand() % 100) < cl_netpacketloss.integer) return 0; - if (developer_networking.integer && length != 0) + if (developer_networking.integer) { char addressstring[128], addressstring2[128]; LHNETADDRESS_ToString(LHNET_AddressFromSocket(mysocket), addressstring, sizeof(addressstring), true); @@ -824,7 +846,6 @@ void NetConn_ConnectionEstablished(lhnetsocket_t *mysocket, lhnetaddress_t *peer cls.state = ca_connected; cls.signon = 0; // need all the signon messages before playing CL_ClearState(); - SCR_BeginLoadingPlaque(); } int NetConn_IsLocalGame(void) @@ -921,8 +942,8 @@ int NetConn_ClientParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length, // legacy/old stuff move it to the menu ASAP // build description strings for the things users care about - snprintf(hostcache_cache[n].line1, sizeof(hostcache_cache[n].line1), "%5d%c%3u/%3u %-65.65s", (int)pingtime, info->protocol != NET_PROTOCOL_VERSION ? '*' : ' ', info->numplayers, info->maxplayers, info->name); - snprintf(hostcache_cache[n].line2, sizeof(hostcache_cache[n].line2), "%-21.21s %-19.19s %-17.17s %-20.20s", info->cname, info->game, info->mod, info->map); + dpsnprintf(hostcache_cache[n].line1, sizeof(hostcache_cache[n].line1), "%5d%c%3u/%3u %-65.65s", (int)pingtime, info->protocol != NET_PROTOCOL_VERSION ? '*' : ' ', info->numplayers, info->maxplayers, info->name); + dpsnprintf(hostcache_cache[n].line2, sizeof(hostcache_cache[n].line2), "%-21.21s %-19.19s %-17.17s %-20.20s", info->cname, info->game, info->mod, info->map); // if ping is especially high, display it as such if (pingtime >= 300) { @@ -961,7 +982,7 @@ int NetConn_ClientParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length, { serverquerycount++; - snprintf (ipstring, sizeof (ipstring), "%u.%u.%u.%u:%u", data[1], data[2], data[3], data[4], (data[5] << 8) | data[6]); + dpsnprintf (ipstring, sizeof (ipstring), "%u.%u.%u.%u:%u", data[1], data[2], data[3], data[4], (data[5] << 8) | data[6]); if (developer.integer) Con_Printf("Requesting info from server %s\n", ipstring); // ignore the rest of the message if the hostcache is full @@ -1297,13 +1318,13 @@ int NetConn_ServerParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length, for (i = 0, n = 0;i < svs.maxclients;i++) if (svs.clients[i].active) n++; - responselength = snprintf(response, sizeof(response), "\377\377\377\377infoResponse\x0A" + responselength = dpsnprintf(response, sizeof(response), "\377\377\377\377infoResponse\x0A" "\\gamename\\%s\\modname\\%s\\sv_maxclients\\%d" "\\clients\\%d\\mapname\\%s\\hostname\\%s\\protocol\\%d%s%s", gamename, com_modname, svs.maxclients, n, sv.name, hostname.string, NET_PROTOCOL_VERSION, challenge ? "\\challenge\\" : "", challenge ? challenge : ""); // does it fit in the buffer? - if (responselength < (int)sizeof(response)) + if (responselength >= 0) { if (developer.integer) Con_Printf("Sending reply to master %s - %s\n", addressstring2, response); @@ -1592,7 +1613,7 @@ void NetConn_QueryMasters(void) #endif // build the getservers - snprintf(request, sizeof(request), "\377\377\377\377getservers %s %u empty full\x0A", gamename, NET_PROTOCOL_VERSION); + dpsnprintf(request, sizeof(request), "\377\377\377\377getservers %s %u empty full\x0A", gamename, NET_PROTOCOL_VERSION); // search internet for (masternum = 0;sv_masters[masternum].name;masternum++) @@ -1712,7 +1733,7 @@ void Net_Stats_f(void) void Net_Slist_f(void) { - HostCache_ResetMask(); + HostCache_ResetMasks(); hostcache_sortbyfield = HCIF_PING; hostcache_sortdescending = false; if (m_state != m_slist) { @@ -1722,8 +1743,6 @@ void Net_Slist_f(void) Con_Print("Listening for replies...\n"); } else HostCache_QueryList(); - - //_HostCache_PingTest(); } void NetConn_Init(void)