+void NetConn_QueryQueueFrame(void)
+{
+ int index;
+ int queries;
+ int maxqueries;
+ double timeouttime;
+ static double querycounter = 0;
+
+ if (serverlist_querysleep)
+ return;
+
+ // each time querycounter reaches 1.0 issue a query
+ querycounter += host_realframetime * net_slist_queriespersecond.value;
+ maxqueries = (int)querycounter;
+ maxqueries = bound(0, maxqueries, net_slist_queriesperframe.integer);
+ querycounter -= maxqueries;
+
+ if( maxqueries == 0 ) {
+ return;
+ }
+
+ // scan serverlist and issue queries as needed
+ serverlist_querysleep = true;
+
+ timeouttime = realtime - net_slist_timeout.value;
+ for( index = 0, queries = 0 ; index < serverlist_cachecount && queries < maxqueries ; index++ )
+ {
+ serverlist_entry_t *entry = &serverlist_cache[ index ];
+ if( entry->query != SQS_QUERYING )
+ {
+ continue;
+ }
+
+ serverlist_querysleep = false;
+ if( entry->querycounter != 0 && entry->querytime > timeouttime )
+ {
+ continue;
+ }
+
+ if( entry->querycounter != (unsigned) net_slist_maxtries.integer )
+ {
+ lhnetaddress_t address;
+ int socket;
+
+ LHNETADDRESS_FromString(&address, entry->info.cname, 0);
+ for (socket = 0; socket < cl_numsockets ; socket++) {
+ NetConn_WriteString(cl_sockets[socket], "\377\377\377\377getinfo", &address);
+ }
+
+ entry->querytime = realtime;
+ entry->querycounter++;
+
+ // if not in the slist menu we should print the server to console
+ if (serverlist_consoleoutput)
+ Con_Printf("querying %25s (%i. try)\n", entry->info.cname, entry->querycounter);
+
+ queries++;
+ }
+ else
+ {
+ entry->query = SQS_TIMEDOUT;
+ }
+ }
+}
+