#define MASTER_PORT 27950
cvar_t sv_public = {0, "sv_public", "1"};
-static cvar_t sv_heartbeatperiod = {CVAR_SAVE, "sv_heartbeatperiod", "180"};
+static cvar_t sv_heartbeatperiod = {CVAR_SAVE, "sv_heartbeatperiod", "120"};
// 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_master2", ""},
{CVAR_SAVE, "sv_master3", ""},
{CVAR_SAVE, "sv_master4", ""},
- {0, "sv_masterextra1", "69.59.212.88"}, // ghdigital.com
- {0, "sv_masterextra2", "66.169.205.13"}, // dpmaster.deathmask.net
- {0, "sv_masterextra3", "12.166.196.192"}, // blaze.mindphukd.org
+ {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}
};
unsigned int count;
unsigned int flags;
unsigned int sequence;
+ int qlength;
if (length >= 8)
{
- length = BigLong(((int *)data)[0]);
- flags = length & ~NETFLAG_LENGTH_MASK;
- length &= NETFLAG_LENGTH_MASK;
+ qlength = (unsigned int)BigLong(((int *)data)[0]);
+ flags = qlength & ~NETFLAG_LENGTH_MASK;
+ qlength &= NETFLAG_LENGTH_MASK;
// control packets were already handled
- if (!(flags & NETFLAG_CTL))
+ if (!(flags & NETFLAG_CTL) && qlength == length)
{
sequence = BigLong(((int *)data)[1]);
packetsReceived++;
conn->lastMessageTime = realtime;
conn->timeout = realtime + net_messagetimeout.value;
conn->receiveSequence++;
- memcpy(conn->receiveMessage + conn->receiveMessageLength, data, length);
- conn->receiveMessageLength += length;
+ if( conn->receiveMessageLength + length <= sizeof( conn->receiveMessage ) ) {
+ memcpy(conn->receiveMessage + conn->receiveMessageLength, data, length);
+ conn->receiveMessageLength += length;
+ } else {
+ Con_Printf( "Reliable message (seq: %i) too big for message buffer!\n"
+ "Dropping the message!\n", sequence );
+ conn->receiveMessageLength = 0;
+ return 1;
+ }
if (flags & NETFLAG_EOM)
{
reliableMessagesReceived++;
for( n = 0; n < serverlist_cachecount; n++ )
if( !strcmp( cname, serverlist_cache[n].info.cname ) )
break;
- if( n == serverlist_cachecount )
- return true;
+ if( n == serverlist_cachecount ) {
+ // LAN search doesnt require an answer from the master server so we wont
+ // know the ping nor will it be initialized already...
+
+ // find a slot
+ if( serverlist_cachecount == SERVERLIST_TOTALSIZE )
+ return true;
+ serverquerycount++;
+
+ memset(&serverlist_cache[serverlist_cachecount], 0, sizeof(serverlist_cache[serverlist_cachecount]));
+ // store the data the engine cares about (address and ping)
+ strlcpy (serverlist_cache[serverlist_cachecount].info.cname, cname, sizeof (serverlist_cache[serverlist_cachecount].info.cname));
+ serverlist_cache[serverlist_cachecount].info.ping = 100000;
+ serverlist_cache[serverlist_cachecount].querytime = realtime;
+ // if not in the slist menu we should print the server to console
+ if (serverlist_consoleoutput) {
+ Con_Printf("querying %s\n", ipstring);
+ }
+ ++serverlist_cachecount;
+
+ }
info = &serverlist_cache[n].info;
if ((s = SearchInfostring(string, "gamename" )) != NULL) strlcpy(info->game, s, sizeof (info->game));else info->game[0] = 0;
if ((s = SearchInfostring(string, "modname" )) != NULL) strlcpy(info->mod , s, sizeof (info->mod ));else info->mod[0] = 0;
buffer[i] = 0;
}
+extern void SV_SendServerinfo (client_t *client);
int NetConn_ServerParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length, lhnetaddress_t *peeraddress)
{
int i, n, ret, clientnum, responselength, best;
for (clientnum = 0, client = svs.clients;clientnum < svs.maxclients;clientnum++, client++)
if (client->netconnection && LHNETADDRESS_Compare(peeraddress, &client->netconnection->peeraddress) == 0)
break;
- if (clientnum < svs.maxclients)
+ if (clientnum < svs.maxclients && realtime - client->connecttime < net_messagerejointimeout.value)
+ {
+ // client is still trying to connect,
+ // so we send a duplicate reply
+ if (developer.integer)
+ Con_Printf("Datagram_ParseConnectionless: sending duplicate accept to %s.\n", addressstring2);
+ NetConn_WriteString(mysocket, "\377\377\377\377accept", peeraddress);
+ }
+#if 0
+ else if (clientnum < svs.maxclients)
{
- // duplicate connection request
- if (realtime - client->connecttime < 2.0)
- {
- // client is still trying to connect,
- // so we send a duplicate reply
- if (developer.integer)
- Con_Printf("Datagram_ParseConnectionless: sending duplicate accept to %s.\n", addressstring2);
- NetConn_WriteString(mysocket, "\377\377\377\377accept", peeraddress);
- }
- // only kick if old connection seems dead
if (realtime - client->netconnection->lastMessageTime >= net_messagerejointimeout.value)
{
- // kick off connection and await retry
- client->deadsocket = true;
+ // client crashed and is coming back, keep their stuff intact
+ SV_SendServerinfo(client);
+ //host_client = client;
+ //SV_DropClient (true);
}
+ // else ignore them
}
+#endif
else
{
// this is a new client, find a slot
NetConn_Write(mysocket, net_message.data, net_message.cursize, peeraddress);
SZ_Clear(&net_message);
}
+#if 0
else if (realtime - client->netconnection->lastMessageTime >= net_messagerejointimeout.value)
{
+ SV_SendServerinfo(client);
// the old client hasn't sent us anything
// in quite a while, so kick off and let
// the retry take care of it...
- client->deadsocket = true;
+ //host_client = client;
+ //SV_DropClient (true);
}
+#endif
}
else
{