From 1232dc2ed2486b8258d5c225bf42d87e6879d2bb Mon Sep 17 00:00:00 2001 From: havoc Date: Fri, 28 Mar 2003 10:31:28 +0000 Subject: [PATCH] net_inetslist (and the corresponding menu as well) now work without being an active server (dfunc.controlSock is now used for all transactions involved, and since there is always one of those...) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2867 d7cf8633-e32d-0410-b094-e92efae38249 --- net_dgrm.c | 16 ++++++---------- net_master.c | 46 ++++++++++++++++++++-------------------------- net_master.h | 4 ++-- 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/net_dgrm.c b/net_dgrm.c index 31b654a8..b71f7f2a 100644 --- a/net_dgrm.c +++ b/net_dgrm.c @@ -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); } diff --git a/net_master.c b/net_master.c index 2b8444c2..c8cefb66 100644 --- a/net_master.c +++ b/net_master.c @@ -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; } diff --git a/net_master.h b/net_master.h index f7cbd67e..a7c3732c 100644 --- a/net_master.h +++ b/net_master.h @@ -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 -- 2.39.2