From 441ffa7c7145cb05c6528744f72ab482ac2989a5 Mon Sep 17 00:00:00 2001 From: stpohle Date: Mon, 28 Mar 2005 16:38:29 +0000 Subject: [PATCH] broadcast and ping times will show up now in the join game list --- include/bomberclone.h | 3 +- include/broadcast.h | 5 ++- src/broadcast.c | 71 +++++++++++++++++++++++++++++++++++-------- src/configuration.c | 26 +++++++++++++++- src/netsrvlist.c | 37 ++++++++++++++-------- src/packets.c | 2 +- 6 files changed, 115 insertions(+), 29 deletions(-) diff --git a/include/bomberclone.h b/include/bomberclone.h index 3ff7df6..e465e8a 100644 --- a/include/bomberclone.h +++ b/include/bomberclone.h @@ -1,4 +1,4 @@ -/* $Id: bomberclone.h,v 1.30 2004/11/07 04:13:09 stpohle Exp $ */ +/* $Id: bomberclone.h,v 1.31 2005/03/28 16:38:29 stpohle Exp $ */ /* bomberclone.h */ #ifndef _BOMBERCLONE_H_ @@ -147,6 +147,7 @@ extern int config_read(); extern int config_write(); extern void ReadPrgArgs (int argc, char **argv); extern void ReadPrgArgs_Jump (int argc, char **argv); +extern int check_version (int ma, int mi, int su, char *ver); // debug.c extern void d_in_pl_detail (char *head); diff --git a/include/broadcast.h b/include/broadcast.h index 49c5dde..7ac1e1b 100644 --- a/include/broadcast.h +++ b/include/broadcast.h @@ -1,8 +1,9 @@ -/* $id:$ */ +/* $Id: broadcast.h,v 1.2 2005/03/28 16:38:29 stpohle Exp $ */ #define BC_MAXENTRYS 64 #define BC_REQUESTTIME 2500 #define BC_REQUESTTIMEOUT 7500 +#define BC_MAXREQUEST 3 struct broadcast_entry { char port[LEN_PORT]; @@ -14,6 +15,8 @@ struct broadcast_entry { int curplayers; int maxplayers; int timestamp; + int try; + int lan; // the broadcasted packet indicates a lan game }; extern struct broadcast_entry broadcast_list []; diff --git a/src/broadcast.c b/src/broadcast.c index 1b770fd..849e628 100644 --- a/src/broadcast.c +++ b/src/broadcast.c @@ -1,8 +1,11 @@ -/* $id:$ - * find broadcasted games */ +/* $Id: broadcast.c,v 1.3 2005/03/28 16:38:34 stpohle Exp $ + * find broadcasted games and also hold in this list + * all games which the ogc reports us */ + #include "bomberclone.h" #include "network.h" #include "packets.h" +#include "ogcache-client.h" #include "broadcast.h" static int bc_lastrequest; @@ -33,20 +36,60 @@ int broadcast_findfree () { } +/* delete entry from the broadcasted list */ +void broadcast_del (int nr) { + + if (nr < (BC_MAXENTRYS -1)) + memcpy (&broadcast_list[nr], &broadcast_list[nr+1], sizeof (struct broadcast_entry) * (BC_MAXENTRYS - (nr+1))); + + broadcast_list[BC_MAXENTRYS-1].host[0] = 0; +} + + /* check for old not seen games */ void broadcast_check () { - int i; + int i, j; + /* check for a new update request on a single game and if a game had timed + * out */ for (i = 0; i < BC_MAXENTRYS; i++) { - while ((broadcast_list[i].host[0] != 0) - && (timestamp - broadcast_list[i].timestamp > BC_REQUESTTIMEOUT)) { - /* delete entry */ - if (i < (BC_MAXENTRYS -1)) - memcpy (&broadcast_list[i], &broadcast_list[i+1], sizeof (struct broadcast_entry) * (BC_MAXENTRYS - (i+1))); - - broadcast_list[BC_MAXENTRYS-1].host[0] = 0; - } + while (broadcast_list[i].host[0] != 0 + && ((broadcast_list[i].try > BC_MAXREQUEST && broadcast_list[i].lan == 0) + || (timestamp - broadcast_list[i].timestamp > BC_REQUESTTIMEOUT && broadcast_list[i].lan == 1))) + broadcast_del (i); + + if (timestamp - broadcast_list[i].timestamp > BC_REQUESTTIME + && broadcast_list[i].lan == 0 && broadcast_list[i].host[0] != 0) { + broadcast_send (broadcast_list[i].host, broadcast_list[i].port); + broadcast_list[i].timestamp = timestamp; + broadcast_list[i].try++; + } + + if (((broadcast_list[i].timestamp < 0) || (timestamp - broadcast_list[i].timestamp < 0)) + && broadcast_list[i].host[0] != 0 && broadcast_list[i].lan == 0) { + broadcast_send (broadcast_list[i].host, broadcast_list[i].port); + broadcast_list[i].timestamp = timestamp; + } } + + /* check for games in the OGC list which are not in the broadcast_list */ + for (i = 0; i < MAX_OGC_ENTRYS; i++) + if ((ogc_array[i].serial != -1) && (broadcast_find (ogc_array[i].host, ogc_array[i].port) == -1)) { + j = broadcast_findfree (); + if ((check_version (0,11,6, ogc_array[i].version) >= 0) && j >= 0) { + strncpy (broadcast_list[j].host, ogc_array[i].host, LEN_SERVERNAME); + strncpy (broadcast_list[j].port, ogc_array[i].port, LEN_PORT); + strncpy (broadcast_list[j].version, ogc_array[i].version, LEN_VERSION); + strncpy (broadcast_list[j].gamename, ogc_array[i].gamename, LEN_GAMENAME); + + d_printf ("broadcast_check: Add: nr:%d game:%s %s:%s\n", j, + broadcast_list[j].gamename, broadcast_list[j].host, broadcast_list[j].port); + broadcast_list[j].timestamp = timestamp; + broadcast_list[j].ping = -1; + broadcast_list[j].lan = 0; + broadcast_list[j].try = 0; + } + } } @@ -95,7 +138,7 @@ void broadcast_loop () { broadcast_send (NULL, NULL); bc_lastrequest = timestamp; } - + pgi = (struct pkg_gameinfo*) &indata; pgi->gamename[0] = 0; addr.port[0] = addr.host[0] = 0; @@ -122,6 +165,9 @@ void broadcast_loop () { broadcast_list[nr].gamename, broadcast_list[nr].host, broadcast_list[nr].port); broadcast_list[nr].timestamp = timestamp; + + broadcast_list[nr].ping = timestamp - pgi->timestamp; + broadcast_list[nr].lan = pgi->broadcast; } } @@ -134,5 +180,4 @@ void broadcast_loop () { } broadcast_check (); - }; diff --git a/src/configuration.c b/src/configuration.c index 71302f1..fd837a2 100644 --- a/src/configuration.c +++ b/src/configuration.c @@ -1,4 +1,4 @@ -/* $Id: configuration.c,v 1.71 2005/03/27 19:22:42 stpohle Exp $ +/* $Id: configuration.c,v 1.72 2005/03/28 16:38:34 stpohle Exp $ * configuration */ #include @@ -710,3 +710,27 @@ ReadPrgArgs_Jump (int argc, char **argv) } } }; + + +/* check the version number, return [ 0 =] [-1 <] [ 1 >] */ +int check_version (int ma, int mi, int su, char *ver) { + int v1, v2, v3, res = 0; + + sscanf (ver, "%d.%d.%d", &v1, &v2, &v3); + if (v1 < ma) + res = -1; + else if (v1 > ma) + res = 1; + else if (v2 < mi) + res = -1; + else if (v2 > mi) + res = 1; + else if (v3 < su) + res = -1; + else if (v3 > su) + res = 1; + + // d_printf ("version_check (%d.%d.%d, %s = %d\n" , ma, mi, su, ver, res); + + return res; +}; diff --git a/src/netsrvlist.c b/src/netsrvlist.c index 3f9b5a3..dadfb1d 100644 --- a/src/netsrvlist.c +++ b/src/netsrvlist.c @@ -1,4 +1,4 @@ -/* $Id: netsrvlist.c,v 1.12 2005/03/28 02:48:34 stpohle Exp $ +/* $Id: netsrvlist.c,v 1.13 2005/03/28 16:38:35 stpohle Exp $ * netsrvlist.c - shows a list of possible servers.*/ #include "basic.h" @@ -21,6 +21,7 @@ struct __srvlst_entry { int maxplayers; int curplayers; int ai_family; + int ping; char comment[32]; } srvlst_dat[MAX_SRVLIST]; int srvlst_cnt = 0; @@ -28,7 +29,7 @@ int srvlst_cnt = 0; /* will build up our srvlst list with * all servers we have in there */ void srvlist_rebuildlist () { - int ogclst, i; + int ogclst, i, j; char txt1[255]; char txt2[255]; @@ -41,31 +42,36 @@ void srvlist_rebuildlist () { srvlst_dat[i].version[0] = 0; srvlst_dat[i].gamename[0] = 0; srvlst_dat[i].comment[0] = 0; + srvlst_dat[i].ping = 0; } srvlst_cnt = 0; - /* add broadcasted list */ - for (i = 0; i < BC_MAXENTRYS; i++) { - if (broadcast_list[i].host[0] != 0) { + /* add broadcasted list (j == LAN GAME) */ + for (j = 1; j >= 0; j--) for (i = 0; i < BC_MAXENTRYS; i++) { + if (broadcast_list[i].host[0] != 0 && broadcast_list[i].lan == j) { strncpy (srvlst_dat[srvlst_cnt].host, broadcast_list[i].host, LEN_SERVERNAME); strncpy (srvlst_dat[srvlst_cnt].port, broadcast_list[i].port, LEN_PORT); strncpy (srvlst_dat[srvlst_cnt].version, broadcast_list[i].version, LEN_VERSION); strncpy (srvlst_dat[srvlst_cnt].gamename, broadcast_list[i].gamename, LEN_GAMENAME); srvlst_dat[srvlst_cnt].ai_family = bman.net_ai_family; - sprintf (srvlst_dat[srvlst_cnt].comment, "LAN"); + if (broadcast_list[i].lan) + sprintf (srvlst_dat[srvlst_cnt].comment, "LAN"); + else + sprintf (srvlst_dat[srvlst_cnt].comment, "Inet"); srvlst_cnt++; } } - /* add the OpenGameCache Entrys */ + /* add the OpenGameCache Entrys which are not in the broadcasted list */ if (bman.notifygamemaster) { for (ogclst = 0; (ogclst < MAX_OGC_ENTRYS && srvlst_cnt < MAX_SRVLIST); ogclst++) - if (ogc_array[ogclst].serial != -1) { + if ((ogc_array[ogclst].serial != -1) && (broadcast_find (ogc_array[ogclst].host, ogc_array[ogclst].port) == -1)) { srvlst_dat[srvlst_cnt].host[0] = 0; srvlst_dat[srvlst_cnt].port[0] = 0; srvlst_dat[srvlst_cnt].version[0] = 0; srvlst_dat[srvlst_cnt].gamename[0] = 0; + srvlst_dat[srvlst_cnt].ping = -2; srvlst_dat[srvlst_cnt].ai_family = ogc_array[ogclst].ai_family; strncpy (srvlst_dat[srvlst_cnt].host,ogc_array[ogclst].host, LEN_SERVERNAME); @@ -81,11 +87,18 @@ void srvlist_rebuildlist () { /* make the list viewable */ for (i = 0; i < srvlst_cnt; i++) { - if (srvlst_dat[i].gamename[0] != 0) /* gamename is present */ - sprintf (txt1, "%-28s %-11s %-4s", srvlst_dat[i].gamename, srvlst_dat[i].version, srvlst_dat[i].comment); + if (srvlst_dat[i].ping == -2) + txt2[0] = 0; + else if (srvlst_dat[i].ping == -1) + sprintf (txt2, "NoCon"); + else + sprintf (txt2, "%dms", srvlst_dat[i].ping); + + if (srvlst_dat[i].gamename[0] != 0) /* gamename is present */ + sprintf (txt1, "%-20s %5s %-11s %-4s", srvlst_dat[i].gamename, txt2, srvlst_dat[i].version, srvlst_dat[i].comment); else { - sprintf (txt2, "%s:%s", srvlst_dat[i].host, srvlst_dat[i].port); - sprintf (txt1, "%-28s %-11s %-4s", txt2, srvlst_dat[i].version, srvlst_dat[i].comment); + sprintf (txt1, "%s:%s", srvlst_dat[i].host, srvlst_dat[i].port); + sprintf (txt1, "%-20s %5s %-11s %-4s", txt1,txt2, srvlst_dat[i].version, srvlst_dat[i].comment); } strncpy (srvlst_text[i].text, txt1, LEN_CHARENTRY); } diff --git a/src/packets.c b/src/packets.c index 89110f1..c4b4cac 100644 --- a/src/packets.c +++ b/src/packets.c @@ -1640,7 +1640,7 @@ void do_respawn (struct pkg_respawn *r_pkg, _net_addr *addr) { ***/ void do_gameinfo (struct pkg_gameinfo *pgi, _net_addr *addr) { if (GT_MP_PTPM && pgi->password == -1) { - d_printf ("do_gameinfo (from: %s:%s)\n", addr->host, addr->port); + d_printf ("do_gameinfo (from: %s:%s) Broadcast Req: %d\n", addr->host, addr->port, pgi->broadcast); strncpy (pgi->version, VERSION, LEN_VERSION); pgi->maxplayers = bman.maxplayer;