#define MASTER_PORT 27950
// note this defaults on for dedicated servers, off for listen servers
-cvar_t sv_public = {0, "sv_public", "0"};
-static cvar_t sv_heartbeatperiod = {CVAR_SAVE, "sv_heartbeatperiod", "120"};
+cvar_t sv_public = {0, "sv_public", "0", "advertises this server on the master server (so that players can find it in the server browser)"};
+static cvar_t sv_heartbeatperiod = {CVAR_SAVE, "sv_heartbeatperiod", "120", "how often to send heartbeat in seconds (only used if sv_public is 1)"};
// FIXME: resolve DNS on masters whenever their value changes and cache it (to avoid major delays in active servers when they heartbeat)
static cvar_t sv_masters [] =
{
- {CVAR_SAVE, "sv_master1", ""},
- {CVAR_SAVE, "sv_master2", ""},
- {CVAR_SAVE, "sv_master3", ""},
- {CVAR_SAVE, "sv_master4", ""},
- {0, "sv_masterextra1", "ghdigital.com"}, //69.59.212.88
- {0, "sv_masterextra2", "dpmaster.deathmask.net"}, //209.164.24.243
- {0, "sv_masterextra3", "12.166.196.192"}, //blaze.mindphukd.org (doesn't resolve currently but works as an ip)
- {0, NULL, NULL}
+ {CVAR_SAVE, "sv_master1", "", "user-chosen master server 1"},
+ {CVAR_SAVE, "sv_master2", "", "user-chosen master server 2"},
+ {CVAR_SAVE, "sv_master3", "", "user-chosen master server 3"},
+ {CVAR_SAVE, "sv_master4", "", "user-chosen master server 4"},
+ {0, "sv_masterextra1", "ghdigital.com", "default master server 1 (admin: LordHavoc)"}, // admin: LordHavoc
+ {0, "sv_masterextra2", "dpmaster.deathmask.net", "default master server 2 (admin: Willis)"}, // admin: Willis
+ {0, "sv_masterextra3", "12.166.196.192", "default master server 3 (admin: Venim)"}, // admin: Venim
+ {0, "sv_masterextra4", "excalibur.nvg.ntnu.no", "default master server 4 (admin: tChr)"}, // admin: tChr
+ {0, NULL, NULL, NULL}
};
static double nextheartbeattime = 0;
sizebuf_t net_message;
-static qbyte net_message_buf[NET_MAXMESSAGE];
+static unsigned char net_message_buf[NET_MAXMESSAGE];
-cvar_t net_messagetimeout = {0, "net_messagetimeout","300"};
-cvar_t net_messagerejointimeout = {0, "net_messagerejointimeout","10"};
-cvar_t net_connecttimeout = {0, "net_connecttimeout","10"};
-cvar_t hostname = {CVAR_SAVE, "hostname", "UNNAMED"};
-cvar_t developer_networking = {0, "developer_networking", "0"};
+cvar_t net_messagetimeout = {0, "net_messagetimeout","300", "drops players who have not sent any packets for this many seconds"};
+cvar_t net_messagerejointimeout = {0, "net_messagerejointimeout","10", "give a player this much time in seconds to rejoin and continue playing (not losing frags and such)"};
+cvar_t net_connecttimeout = {0, "net_connecttimeout","10", "after requesting a connection, the client must reply within this many seconds or be dropped (cuts down on connect floods)"};
+cvar_t hostname = {CVAR_SAVE, "hostname", "UNNAMED", "server message to show in server browser"};
+cvar_t developer_networking = {0, "developer_networking", "0", "prints all received and sent packets (recommended only for debugging)"};
-cvar_t cl_netlocalping = {0, "cl_netlocalping","0"};
-static cvar_t cl_netpacketloss = {0, "cl_netpacketloss","0"};
-static cvar_t net_slist_queriespersecond = {0, "net_slist_queriespersecond", "20"};
-static cvar_t net_slist_queriesperframe = {0, "net_slist_queriesperframe", "4"};
-static cvar_t net_slist_timeout = {0, "net_slist_timeout", "4"};
-static cvar_t net_slist_maxtries = {0, "net_slist_maxtries", "3"};
+cvar_t cl_netlocalping = {0, "cl_netlocalping","0", "lags local loopback connection by this much ping time (useful to play more fairly on your own server with people with higher pings)"};
+static cvar_t cl_netpacketloss = {0, "cl_netpacketloss","0", "drops this percentage of packets (incoming and outgoing), useful for testing network protocol robustness (effects failing to start, sounds failing to play, etc)"};
+static cvar_t net_slist_queriespersecond = {0, "net_slist_queriespersecond", "20", "how many server information requests to send per second"};
+static cvar_t net_slist_queriesperframe = {0, "net_slist_queriesperframe", "4", "maximum number of server information requests to send each rendered frame (guards against low framerates causing problems)"};
+static cvar_t net_slist_timeout = {0, "net_slist_timeout", "4", "how long to listen for a server information response before giving up"};
+static cvar_t net_slist_maxtries = {0, "net_slist_maxtries", "3", "how many times to ask the same server for information (more times gives better ping reports but takes longer)"};
/* statistic counters */
static int packetsSent = 0;
// this is only false if there are still servers left to query
int serverlist_querysleep = true;
-static qbyte sendbuffer[NET_HEADERSIZE+NET_MAXMESSAGE];
-static qbyte readbuffer[NET_HEADERSIZE+NET_MAXMESSAGE];
+static unsigned char sendbuffer[NET_HEADERSIZE+NET_MAXMESSAGE];
+static unsigned char readbuffer[NET_HEADERSIZE+NET_MAXMESSAGE];
int cl_numsockets;
lhnetsocket_t *cl_sockets[16];
netconn_t *netconn_list = NULL;
mempool_t *netconn_mempool = NULL;
-cvar_t cl_netport = {0, "cl_port", "0"};
-cvar_t sv_netport = {0, "port", "26000"};
-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]"};
+cvar_t cl_netport = {0, "cl_port", "0", "forces client to use chosen port number if not 0"};
+cvar_t sv_netport = {0, "port", "26000", "server port for players to connect to"};
+cvar_t net_address = {0, "net_address", "0.0.0.0", "network address to open ports on"};
+//cvar_t net_netaddress_ipv6 = {0, "net_address_ipv6", "[0:0:0:0:0:0:0:0]", "network address to open ipv6 ports on"};
// ServerList interface
serverlist_mask_t serverlist_andmasks[SERVERLIST_ANDMASKCOUNT];
static qboolean _ServerList_CompareStr( const char *A, serverlist_maskop_t op, const char *B )
{
+ int i;
+ char bufferA[ 256 ], bufferB[ 256 ]; // should be more than enough
+ for (i = 0;i < (int)sizeof(bufferA)-1 && A[i];i++)
+ bufferA[i] = (A[i] >= 'A' && A[i] <= 'Z') ? (A[i] + 'a' - 'A') : A[i];
+ bufferA[i] = 0;
+ for (i = 0;i < (int)sizeof(bufferB)-1 && B[i];i++)
+ bufferB[i] = (B[i] >= 'A' && B[i] <= 'Z') ? (B[i] + 'a' - 'A') : B[i];
+ bufferB[i] = 0;
+
// Same here, also using an intermediate & final return would be more appropriate
// A info B mask
switch( op ) {
case SLMO_CONTAINS:
- return *B && !!strstr( A, B ); // we want a real bool
+ return *bufferB && !!strstr( bufferA, bufferB ); // we want a real bool
case SLMO_NOTCONTAIN:
- return !*B || !strstr( A, B );
+ return !*bufferB || !strstr( bufferA, bufferB );
case SLMO_LESS:
- return strcmp( A, B ) < 0;
+ return strcmp( bufferA, bufferB ) < 0;
case SLMO_LESSEQUAL:
- return strcmp( A, B ) <= 0;
+ return strcmp( bufferA, bufferB ) <= 0;
case SLMO_EQUAL:
- return strcmp( A, B ) == 0;
+ return strcmp( bufferA, bufferB ) == 0;
case SLMO_GREATER:
- return strcmp( A, B ) > 0;
+ return strcmp( bufferA, bufferB ) > 0;
case SLMO_NOTEQUAL:
- return strcmp( A, B ) != 0;
+ return strcmp( bufferA, bufferB ) != 0;
case SLMO_GREATEREQUAL:
- return strcmp( A, B ) >= 0;
+ return strcmp( bufferA, bufferB ) >= 0;
default:
Con_DPrint( "_ServerList_CompareStr: Bad op!\n" );
return false;
for( i = 0 ; i < 1024 ; i++ ) {
memset( &serverlist_cache[serverlist_cachecount], 0, sizeof( serverlist_entry_t ) );
serverlist_cache[serverlist_cachecount].info.ping = 1000 + 1024 - i;
- dpsnprintf( serverlist_cache[serverlist_cachecount].info.name, 128, "Black's ServerList Test %i", i );
+ dpsnprintf( serverlist_cache[serverlist_cachecount].info.name, sizeof(serverlist_cache[serverlist_cachecount].info.name), "Black's ServerList Test %i", i );
serverlist_cache[serverlist_cachecount].finished = true;
sprintf( serverlist_cache[serverlist_cachecount].line1, "%i %s", serverlist_cache[serverlist_cachecount].info.ping, serverlist_cache[serverlist_cachecount].info.name );
ServerList_ViewList_Insert( &serverlist_cache[serverlist_cachecount] );
{
LHNETADDRESS_ToString(peeraddress, addressstring2, sizeof(addressstring2), true);
Con_Printf("LHNET_Read(%p (%s), %p, %i, %p) = %i from %s:\n", mysocket, addressstring, data, maxlength, peeraddress, length, addressstring2);
- Com_HexDumpToConsole(data, length);
+ Com_HexDumpToConsole((unsigned char *)data, length);
}
else
Con_Printf("LHNET_Read(%p (%s), %p, %i, %p) = %i\n", mysocket, addressstring, data, maxlength, peeraddress, length);
LHNETADDRESS_ToString(LHNET_AddressFromSocket(mysocket), addressstring, sizeof(addressstring), true);
LHNETADDRESS_ToString(peeraddress, addressstring2, sizeof(addressstring2), true);
Con_Printf("LHNET_Write(%p (%s), %p, %i, %p (%s)) = %i%s\n", mysocket, addressstring, data, length, peeraddress, addressstring2, length, ret == length ? "" : " (ERROR)");
- Com_HexDumpToConsole(data, length);
+ Com_HexDumpToConsole((unsigned char *)data, length);
}
return ret;
}
int NetConn_WriteString(lhnetsocket_t *mysocket, const char *string, const lhnetaddress_t *peeraddress)
{
// note this does not include the trailing NULL because we add that in the parser
- return NetConn_Write(mysocket, string, strlen(string), peeraddress);
+ return NetConn_Write(mysocket, string, (int)strlen(string), peeraddress);
}
int NetConn_SendReliableMessage(netconn_t *conn, sizebuf_t *data)
//#ifdef DEBUG
if (data->cursize == 0)
- Sys_Error("Datagram_SendMessage: zero length message\n");
+ {
+ Con_Printf ("Datagram_SendMessage: zero length message\n");
+ return -1;
+ }
if (data->cursize > (int)sizeof(conn->sendMessage))
- Sys_Error("Datagram_SendMessage: message too big (%u > %u)\n", data->cursize, sizeof(conn->sendMessage));
+ {
+ Con_Printf ("Datagram_SendMessage: message too big (%u > %u)\n", data->cursize, sizeof(conn->sendMessage));
+ return -1;
+ }
if (conn->canSend == false)
- Sys_Error("SendMessage: called with canSend == false\n");
+ {
+ Con_Printf ("SendMessage: called with canSend == false\n");
+ return -1;
+ }
//#endif
memcpy(conn->sendMessage, data->data, data->cursize);
packetLen = NET_HEADERSIZE + dataLen;
- header = (void *)sendbuffer;
+ header = (unsigned int *)sendbuffer;
header[0] = BigLong(packetLen | (NETFLAG_DATA | eom));
header[1] = BigLong(conn->sendSequence);
memcpy(sendbuffer + NET_HEADERSIZE, conn->sendMessage, dataLen);
packetLen = NET_HEADERSIZE + dataLen;
- header = (void *)sendbuffer;
+ header = (unsigned int *)sendbuffer;
header[0] = BigLong(packetLen | (NETFLAG_DATA | eom));
header[1] = BigLong(conn->sendSequence);
memcpy(sendbuffer + NET_HEADERSIZE, conn->sendMessage, dataLen);
packetLen = NET_HEADERSIZE + dataLen;
- header = (void *)sendbuffer;
+ header = (unsigned int *)sendbuffer;
header[0] = BigLong(packetLen | (NETFLAG_DATA | eom));
header[1] = BigLong(conn->sendSequence - 1);
memcpy(sendbuffer + NET_HEADERSIZE, conn->sendMessage, dataLen);
int NetConn_SendUnreliableMessage(netconn_t *conn, sizebuf_t *data)
{
int packetLen;
- int *header;
+ unsigned int *header;
packetLen = NET_HEADERSIZE + data->cursize;
//#ifdef DEBUG
if (data->cursize == 0)
- Sys_Error("Datagram_SendUnreliableMessage: zero length message\n");
+ {
+ Con_Printf ("Datagram_SendUnreliableMessage: zero length message\n");
+ return -1;
+ }
if (packetLen > (int)sizeof(sendbuffer))
- Sys_Error("Datagram_SendUnreliableMessage: message too big %u\n", data->cursize);
+ {
+ Con_Printf ("Datagram_SendUnreliableMessage: message too big %u\n", data->cursize);
+ return -1;
+ }
//#endif
- header = (void *)sendbuffer;
+ header = (unsigned int *)sendbuffer;
header[0] = BigLong(packetLen | NETFLAG_UNRELIABLE);
header[1] = BigLong(conn->unreliableSendSequence);
memcpy(sendbuffer + NET_HEADERSIZE, data->data, data->cursize);
{
lhnetaddress_t address;
lhnetsocket_t *s;
+ int port;
char addressstring2[1024];
- if (LHNETADDRESS_FromString(&address, addressstring, defaultport))
+
+ for (port = defaultport; port <= defaultport + 100; port++)
{
- if ((s = LHNET_OpenSocket_Connectionless(&address)))
+ if (LHNETADDRESS_FromString(&address, addressstring, port))
{
- sv_sockets[sv_numsockets++] = s;
- LHNETADDRESS_ToString(LHNET_AddressFromSocket(s), addressstring2, sizeof(addressstring2), true);
- Con_Printf("Server listening on address %s\n", addressstring2);
+ if ((s = LHNET_OpenSocket_Connectionless(&address)))
+ {
+ sv_sockets[sv_numsockets++] = s;
+ LHNETADDRESS_ToString(LHNET_AddressFromSocket(s), addressstring2, sizeof(addressstring2), true);
+ Con_Printf("Server listening on address %s\n", addressstring2);
+ break;
+ }
+ else
+ {
+ LHNETADDRESS_ToString(&address, addressstring2, sizeof(addressstring2), true);
+ Con_Printf("Server failed to open socket on address %s\n", addressstring2);
+ }
}
else
{
- LHNETADDRESS_ToString(&address, addressstring2, sizeof(addressstring2), true);
- Con_Printf("Server failed to open socket on address %s\n", addressstring2);
+ Con_Printf("Server unable to parse address %s\n", addressstring);
+ // if it cant parse one address, it wont be able to parse another for sure
+ break;
}
}
- else
- Con_Printf("Server unable to parse address %s\n", addressstring);
}
void NetConn_OpenServerPorts(int opennetports)
{
int port;
NetConn_CloseServerPorts();
+ NetConn_UpdateSockets();
port = bound(0, sv_netport.integer, 65535);
if (port == 0)
port = 26000;
//NetConn_OpenServerPort(net_address_ipv6.string, port);
}
if (sv_numsockets == 0)
- Host_Error("NetConn_OpenServerPorts: unable to open any ports!\n");
+ Host_Error("NetConn_OpenServerPorts: unable to open any ports!");
}
lhnetsocket_t *NetConn_ChooseClientSocketForAddress(lhnetaddress_t *address)
netconn_t *NetConn_Open(lhnetsocket_t *mysocket, lhnetaddress_t *peeraddress)
{
netconn_t *conn;
- conn = Mem_Alloc(netconn_mempool, sizeof(*conn));
+ conn = (netconn_t *)Mem_Alloc(netconn_mempool, sizeof(*conn));
conn->mysocket = mysocket;
conn->peeraddress = *peeraddress;
conn->canSend = true;
conn->lastMessageTime = realtime;
+ conn->message.data = conn->messagedata;
+ conn->message.maxsize = sizeof(conn->messagedata);
+ conn->message.cursize = 0;
// LordHavoc: (inspired by ProQuake) use a short connect timeout to
// reduce effectiveness of connection request floods
conn->timeout = realtime + net_connecttimeout.value;
static int clientport = -1;
static int clientport2 = -1;
static int hostport = -1;
-static void NetConn_UpdateServerStuff(void)
+void NetConn_UpdateSockets(void)
{
if (cls.state != ca_dedicated)
{
}
}
-int NetConn_ReceivedMessage(netconn_t *conn, qbyte *data, int length)
+int NetConn_ReceivedMessage(netconn_t *conn, unsigned char *data, int length)
{
unsigned int count;
unsigned int flags;
unsigned int temppacket[2];
temppacket[0] = BigLong(8 | NETFLAG_ACK);
temppacket[1] = BigLong(sequence);
- NetConn_Write(conn->mysocket, (qbyte *)temppacket, 8, &conn->peeraddress);
+ NetConn_Write(conn->mysocket, (unsigned char *)temppacket, 8, &conn->peeraddress);
if (sequence == conn->receiveSequence)
{
conn->lastMessageTime = realtime;
conn->timeout = realtime + net_messagetimeout.value;
conn->receiveSequence++;
- if( conn->receiveMessageLength + length <= sizeof( conn->receiveMessage ) ) {
+ if( conn->receiveMessageLength + length <= (int)sizeof( conn->receiveMessage ) ) {
memcpy(conn->receiveMessage + conn->receiveMessageLength, data, length);
conn->receiveMessageLength += length;
} else {
CL_Disconnect();
// if we're connecting to a remote server, shut down any local server
if (LHNETADDRESS_GetAddressType(peeraddress) != LHNETADDRESSTYPE_LOOP && sv.active)
- Host_ShutdownServer (false);
+ Host_ShutdownServer ();
// allocate a net connection to keep track of things
cls.netcon = NetConn_Open(mysocket, peeraddress);
Con_Printf("Connection accepted to %s\n", cls.netcon->address);
return false;
}
-int NetConn_ClientParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length, lhnetaddress_t *peeraddress)
+int NetConn_ClientParsePacket(lhnetsocket_t *mysocket, unsigned char *data, int length, lhnetaddress_t *peeraddress)
{
int ret, c, control;
const char *s;
if (length >= 13 && !memcmp(string, "infoResponse\x0A", 13))
{
serverlist_info_t *info;
- int i, n;
+ int n;
double pingtime;
string += 13;
// legacy/old stuff move it to the menu ASAP
// build description strings for the things users care about
- dpsnprintf(serverlist_cache[n].line1, sizeof(serverlist_cache[n].line1), "%5d%c%3u/%3u %-65.65s", (int)pingtime, info->protocol != NET_PROTOCOL_VERSION ? '*' : ' ', info->numplayers, info->maxplayers, info->name);
+ dpsnprintf(serverlist_cache[n].line1, sizeof(serverlist_cache[n].line1), "%c%c%5d%c%c%c%3u/%3u %-65.65s", STRING_COLOR_TAG, pingtime >= 300 ? '1' : (pingtime >= 200 ? '3' : '7'), (int)pingtime, STRING_COLOR_TAG, STRING_COLOR_DEFAULT + '0', info->protocol != NET_PROTOCOL_VERSION ? '*' : ' ', info->numplayers, info->maxplayers, info->name);
dpsnprintf(serverlist_cache[n].line2, sizeof(serverlist_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)
- {
- // orange numbers (lower block)
- for (i = 0;i < 5;i++)
- if (serverlist_cache[n].line1[i] != ' ')
- serverlist_cache[n].line1[i] += 128;
- }
- else if (pingtime >= 200)
- {
- // yellow numbers (in upper block)
- for (i = 0;i < 5;i++)
- if (serverlist_cache[n].line1[i] != ' ')
- serverlist_cache[n].line1[i] -= 30;
- }
if( serverlist_cache[n].query == SQS_QUERIED ) {
ServerList_ViewList_Remove( &serverlist_cache[n] );
}
if (developer.integer)
Con_Printf("Datagram_ParseConnectionless: received CCREP_REJECT from %s.\n", addressstring2);
cls.connect_trying = false;
- M_Update_Return_Reason(data);
+ M_Update_Return_Reason((char *)data);
break;
#if 0
case CCREP_SERVER_INFO:
for( index = 0, queries = 0 ; index < serverlist_cachecount && queries < maxqueries ; index++ )
{
serverlist_entry_t *entry = &serverlist_cache[ index ];
- if( entry->query != SQS_QUERYING )
+ if( entry->query != SQS_QUERYING )
{
continue;
}
continue;
}
- if( entry->querycounter != (unsigned) net_slist_maxtries.integer )
+ if( entry->querycounter != (unsigned) net_slist_maxtries.integer )
{
lhnetaddress_t address;
int socket;
Con_Printf("querying %25s (%i. try)\n", entry->info.cname, entry->querycounter);
queries++;
- }
- else
+ }
+ else
{
entry->query = SQS_TIMEDOUT;
}
int i, length;
lhnetaddress_t peeraddress;
netconn_t *conn;
- NetConn_UpdateServerStuff();
+ NetConn_UpdateSockets();
if (cls.connect_trying && cls.connect_nextsendtime < realtime)
{
if (cls.connect_remainingtries == 0)
{
Con_Print("Connection timed out\n");
CL_Disconnect();
- Host_ShutdownServer (false);
+ Host_ShutdownServer ();
}
for (conn = netconn_list;conn;conn = conn->next)
NetConn_ReSendMessage(conn);
}
#define MAX_CHALLENGES 128
-struct
+struct challenge_s
{
lhnetaddress_t address;
double time;
int length;
// How many clients are there?
- for (i = 0;i < svs.maxclients;i++)
+ for (i = 0;i < (unsigned int)svs.maxclients;i++)
if (svs.clients[i].active)
nb_clients++;
int left;
ptr = out_msg + length;
- left = out_size - length;
+ left = (int)out_size - length;
- for (i = 0;i < svs.maxclients;i++)
+ for (i = 0;i < (unsigned int)svs.maxclients;i++)
{
client_t *cl = &svs.clients[i];
if (cl->active)
}
extern void SV_SendServerinfo (client_t *client);
-int NetConn_ServerParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length, lhnetaddress_t *peeraddress)
+int NetConn_ServerParsePacket(lhnetsocket_t *mysocket, unsigned char *data, int length, lhnetaddress_t *peeraddress)
{
int i, ret, clientnum, best;
double besttime;
int i, length;
lhnetaddress_t peeraddress;
netconn_t *conn;
- NetConn_UpdateServerStuff();
+ NetConn_UpdateSockets();
for (i = 0;i < sv_numsockets;i++)
while (sv_sockets[i] && (length = NetConn_Read(sv_sockets[i], readbuffer, sizeof(readbuffer), &peeraddress)) > 0)
NetConn_ServerParsePacket(sv_sockets[i], readbuffer, length, &peeraddress);
}
}
-int NetConn_SendToAll(sizebuf_t *data, double blocktime)
-{
- int i, count = 0;
- qbyte sent[MAX_SCOREBOARD];
-
- memset(sent, 0, sizeof(sent));
-
- // simultaneously wait for the first CanSendMessage and send the message,
- // then wait for a second CanSendMessage (verifying it was received), or
- // the client drops and is no longer counted
- // the loop aborts when either it runs out of clients to send to, or a
- // timeout expires
- blocktime += Sys_DoubleTime();
- do
- {
- count = 0;
- NetConn_ClientFrame();
- NetConn_ServerFrame();
- for (i = 0, host_client = svs.clients;i < svs.maxclients;i++, host_client++)
- {
- if (host_client->netconnection)
- {
- if (NetConn_CanSendMessage(host_client->netconnection))
- {
- if (!sent[i])
- NetConn_SendReliableMessage(host_client->netconnection, data);
- sent[i] = true;
- }
- if (!NetConn_CanSendMessage(host_client->netconnection))
- count++;
- }
- }
- }
- while (count && Sys_DoubleTime() < blocktime);
- return count;
-}
-
static void Net_Heartbeat_f(void)
{
if (sv.active)
int i;
lhnetaddress_t tempaddress;
netconn_mempool = Mem_AllocPool("network connections", 0, NULL);
- Cmd_AddCommand("net_stats", Net_Stats_f);
- Cmd_AddCommand("net_slist", Net_Slist_f);
- Cmd_AddCommand("heartbeat", Net_Heartbeat_f);
+ Cmd_AddCommand("net_stats", Net_Stats_f, "print network statistics");
+ Cmd_AddCommand("net_slist", Net_Slist_f, "query master series and print all server information");
+ Cmd_AddCommand("heartbeat", Net_Heartbeat_f, "send a heartbeat to the master server (updates your server information)");
Cvar_RegisterVariable(&net_slist_queriespersecond);
Cvar_RegisterVariable(&net_slist_queriesperframe);
Cvar_RegisterVariable(&net_slist_timeout);