]> git.rm.cloudns.org Git - xonotic/darkplaces.git/commitdiff
net_inetslist (and the corresponding menu as well) now work without being an active...
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Fri, 28 Mar 2003 10:31:28 +0000 (10:31 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Fri, 28 Mar 2003 10:31:28 +0000 (10:31 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2867 d7cf8633-e32d-0410-b094-e92efae38249

net_dgrm.c
net_master.c
net_master.h

index 31b654a83f5aaa714f26625b9e32c629a653c47e..b71f7f2a719d21ae612d8f4c592646edbcec38fd 100644 (file)
@@ -1092,7 +1092,7 @@ qsocket_t *Datagram_CheckNewConnections (void)
 
 static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr)
 {
-       struct qsockaddr myaddr;
+       //struct qsockaddr myaddr;
        int control;
        int c, n, i;
 
@@ -1100,7 +1100,7 @@ static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr)
                return false;
 
        // don't answer our own query
-       dfunc.GetSocketAddr (dfunc.controlSock, &myaddr);
+       //dfunc.GetSocketAddr (dfunc.controlSock, &myaddr);
        //if (dfunc.AddrCompare(readaddr, &myaddr) >= 0)
        //      return false;
 
@@ -1230,23 +1230,18 @@ static qboolean _Datagram_SearchForInetHosts (const char *master)
                                portnum = MASTER_PORT;
                        Con_DPrintf("Datagram_SearchForInetHosts: sending %d byte message to master %s port %i\n", net_message.cursize, master, portnum);
                        dfunc.SetSocketPort (&masteraddr, portnum);
-                       dfunc.Send (net_message.data, net_message.cursize, &masteraddr);
+                       dfunc.Write (dfunc.controlSock, net_message.data, net_message.cursize, &masteraddr);
                }
        }
 
-       while ((ret = dfunc.Recv (net_message.data, net_message.maxsize, &readaddr)) > 0)
-       {
-               net_message.cursize = ret;
-               Con_DPrintf("Datagram_SearchForInetHosts: Recv received %d byte message\n", net_message.cursize);
-               Master_ParseServerList (&dfunc);
-       }
-
        while ((ret = dfunc.Read (dfunc.controlSock, net_message.data, net_message.maxsize, &readaddr)) > 0)
        {
                net_message.cursize = ret;
                Con_DPrintf("Datagram_SearchForInetHosts: Read received %d byte message\n", net_message.cursize);
                if (Datagram_HandleServerInfo (&readaddr))
                        result = true;
+               else
+                       Master_ParseServerList (&dfunc);
        }
 
        return result;
@@ -1462,6 +1457,7 @@ static void _Datagram_Heartbeat (const char *master)
                portnum = MASTER_PORT;
        dfunc.SetSocketPort (&masteraddr, portnum);
 
+       // FIXME: this is the only use of UDP_Send in the entire engine, add a dfunc.acceptSock to get rid of this function!
        dfunc.Send (net_message.data, net_message.cursize, &masteraddr);
 }
 
index 2b8444c224e955c47e52f7f35300c322f6ad8658..c8cefb66f3b3dcc545128f7d7f432458be600ee9 100644 (file)
@@ -232,16 +232,18 @@ void Master_Init (void)
 Master_ParseServerList
 
 Parse getserverResponse messages
+Returns true if it was a valid getserversResponse
 ====================
 */
-void Master_ParseServerList (net_landriver_t* dfunc)
+int Master_ParseServerList (net_landriver_t* dfunc)
 {
+       int servercount = 0;
        int control;
        qbyte* servers;
        qbyte* crtserver;
-       unsigned int ipaddr;
        struct qsockaddr svaddr;
        char ipstring [32];
+       char string[32];
 
        if (developer.integer)
        {
@@ -249,45 +251,33 @@ void Master_ParseServerList (net_landriver_t* dfunc)
                SZ_HexDumpToConsole(&net_message);
        }
 
-       if (net_message.cursize < (int)sizeof(int))
-               return;
+       if (net_message.cursize < 23)
+               return 0;
 
        // is the cache full?
        if (hostCacheCount == HOSTCACHESIZE)
-               return;
+               return 0;
 
        MSG_BeginReading ();
-       control = BigLong(*((int *)net_message.data));
-       MSG_ReadLong();
+       control = MSG_ReadBigLong();
        if (control != -1)
-               return;
+               return 0;
 
-       if (strncmp (net_message.data + 4, "getserversResponse\\", 19))
-               return;
-
-       // Skip the next 19 bytes
-       MSG_ReadLong(); MSG_ReadLong(); MSG_ReadLong(); MSG_ReadLong();
-       MSG_ReadShort(); MSG_ReadByte();
+       if (MSG_ReadBytes(19, string) < 19 || memcmp(string, "getserversResponse\\", 19))
+               return 0;
 
        crtserver = servers = Z_Malloc (net_message.cursize - 23);
        memcpy (servers , net_message.data + 23, net_message.cursize - 23);
 
        // Extract the IP addresses
-       while ((ipaddr = (crtserver[3] << 24) | (crtserver[2] << 16) | (crtserver[1] << 8) | crtserver[0]) != 0xFFFFFFFF)
+       while ((crtserver[0] != 0xFF || crtserver[1] != 0xFF || crtserver[2] != 0xFF || crtserver[3] != 0xFF) && (crtserver[4] != 0 || crtserver[5] != 0))
        {
-               int port = (crtserver[5] << 8) | crtserver[4];
-
-               if (port < 1 || port >= 65535)
-                       break;
-
-               port = ((port >> 8) & 0xFF) + ((port & 0xFF) << 8);
-               sprintf (ipstring, "%u.%u.%u.%u:%hu",
-                                       ipaddr & 0xFF, (ipaddr >> 8) & 0xFF,
-                                       (ipaddr >> 16) & 0xFF, (ipaddr >> 24) & 0xFF,
-                                       port);
+               // LordHavoc: FIXME: this could be much faster than converting to a string and back
+               // LordHavoc: FIXME: this code is very UDP specific, perhaps it should be part of net_udp?
+               sprintf (ipstring, "%u.%u.%u.%u:%u", crtserver[0], crtserver[1], crtserver[2], crtserver[3], (crtserver[4] << 8) | crtserver[5]);
                dfunc->GetAddrFromName (ipstring, &svaddr);
-
                Con_DPrintf("Requesting info from server %s\n", ipstring);
+
                // Send a request at this address
                SZ_Clear(&net_message);
                MSG_WriteLong(&net_message, 0);  // save space for the header, filled in later
@@ -298,10 +288,14 @@ void Master_ParseServerList (net_landriver_t* dfunc)
                dfunc->Write(dfunc->controlSock, net_message.data, net_message.cursize, &svaddr);
                SZ_Clear(&net_message);
 
+               servercount++;
+
                if (crtserver[6] != '\\')
                        break;
                crtserver += 7;
        }
 
        Z_Free (servers);
+
+       return servercount;
 }
index f7cbd67e8b7282d7f55408d7f2d1b76d11acbf48..a7c3732cf06a7288ec7a6c43950de6d1730d28ce 100644 (file)
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -29,6 +29,6 @@ const char*   Master_BuildGetServers (void);
 const char*    Master_BuildHeartbeat (void);
 int                    Master_HandleMessage (void);
 void           Master_Init (void);
-void           Master_ParseServerList (net_landriver_t* dfunc);
+int                    Master_ParseServerList (net_landriver_t* dfunc);
 
 #endif