]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - netconn.c
-Now netconn also accepts infoRespones from LAN servers when there is no
[xonotic/darkplaces.git] / netconn.c
index 4e68c72a15ffc8013de416b27d789937341f6085..2061a86523eb9f91c99d78c2d8bb9724bc4a8f3a 100755 (executable)
--- a/netconn.c
+++ b/netconn.c
@@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #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 [] =
@@ -35,9 +35,9 @@ 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}
 };
 
@@ -763,14 +763,15 @@ int NetConn_ReceivedMessage(netconn_t *conn, qbyte *data, int length)
        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++;
@@ -844,8 +845,15 @@ int NetConn_ReceivedMessage(netconn_t *conn, qbyte *data, int length)
                                        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++;
@@ -955,9 +963,28 @@ int NetConn_ClientParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length,
                        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;
@@ -1228,6 +1255,7 @@ static void NetConn_BuildChallengeString(char *buffer, int bufferlength)
        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;
@@ -1303,24 +1331,27 @@ int NetConn_ServerParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length,
                                                        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
@@ -1448,13 +1479,17 @@ int NetConn_ServerParsePacket(lhnetsocket_t *mysocket, qbyte *data, int length,
                                                                        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
                                                        {