Fixed some list element problem in netsrvlst routines.origin
parent
de50b066cf
commit
e072547df6
@ -0,0 +1,26 @@
|
||||
/* $id:$ */
|
||||
|
||||
#define BC_MAXENTRYS 64
|
||||
#define BC_REQUESTTIME 2500
|
||||
#define BC_REQUESTTIMEOUT 7500
|
||||
|
||||
struct broadcast_entry {
|
||||
char port[LEN_PORT];
|
||||
char host[LEN_SERVERNAME];
|
||||
char gamename[LEN_GAMENAME];
|
||||
char version[LEN_VERSION];
|
||||
int ping;
|
||||
int password;
|
||||
int curplayers;
|
||||
int maxplayers;
|
||||
int timestamp;
|
||||
};
|
||||
|
||||
extern struct broadcast_entry broadcast_list [];
|
||||
|
||||
extern void broadcast_send (char *host, char *port);
|
||||
void broadcast_init ();
|
||||
void broadcast_loop ();
|
||||
int broadcast_find (char *host, char *port);
|
||||
int broadcast_findfree ();
|
||||
void broadcast_check ();
|
@ -0,0 +1,138 @@
|
||||
/* $id:$
|
||||
* find broadcasted games */
|
||||
#include "bomberclone.h"
|
||||
#include "network.h"
|
||||
#include "packets.h"
|
||||
#include "broadcast.h"
|
||||
|
||||
static int bc_lastrequest;
|
||||
struct broadcast_entry broadcast_list [BC_MAXENTRYS];
|
||||
|
||||
|
||||
/* find a game on the same server and port */
|
||||
int broadcast_find (char *host, char *port) {
|
||||
int i;
|
||||
|
||||
for (i = 0; ((strncmp (host, broadcast_list[i].host, LEN_SERVERNAME) != 0)
|
||||
&& (strncmp (port, broadcast_list[i].port, LEN_PORT) != 0)
|
||||
&& (i < BC_MAXENTRYS)); i++);
|
||||
|
||||
if (i >= BC_MAXENTRYS)
|
||||
i = -1;
|
||||
return i;
|
||||
};
|
||||
|
||||
|
||||
/* find next free game */
|
||||
int broadcast_findfree () {
|
||||
int i;
|
||||
|
||||
for (i = 0; (broadcast_list[i].host[0] != 0) && (i < BC_MAXENTRYS); i++);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
/* check for old not seen games */
|
||||
void broadcast_check () {
|
||||
int i;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* open and send the first broadcast request */
|
||||
void broadcast_init () {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < BC_MAXENTRYS; i++)
|
||||
broadcast_list[i].host[0] = 0;
|
||||
|
||||
broadcast_send (NULL, NULL);
|
||||
bc_lastrequest = timestamp;
|
||||
};
|
||||
|
||||
|
||||
/* send the broadcast information */
|
||||
void broadcast_send (char *host, char *port) {
|
||||
_net_addr addr;
|
||||
|
||||
|
||||
if (host != NULL && port != NULL) {
|
||||
strncpy (addr.host, host, LEN_SERVERNAME);
|
||||
strncpy (addr.port, port, LEN_PORT);
|
||||
d_printf ("broadcast_send (%s:%s)\n", addr.host, addr.port);
|
||||
dns_filladdr (addr.host, LEN_SERVERNAME, addr.port, LEN_PORT, bman.net_ai_family, &addr.sAddr);
|
||||
send_gameinfo (&addr, bman.sock, 0);
|
||||
}
|
||||
else {
|
||||
sprintf (addr.port, "%d", DEFAULT_UDPPORT);
|
||||
strncpy (addr.host, "255.255.255.255", LEN_SERVERNAME);
|
||||
d_printf ("broadcast_send (%s:%s)\n", addr.host, addr.port);
|
||||
dns_filladdr (addr.host, LEN_SERVERNAME, addr.port, LEN_PORT, bman.net_ai_family, &addr.sAddr);
|
||||
send_gameinfo (&addr, bman.sock, 1);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void broadcast_loop () {
|
||||
int inlen;
|
||||
char indata [MAX_UDPDATA];
|
||||
struct pkg_gameinfo *pgi;
|
||||
_net_addr addr;
|
||||
|
||||
if ((timestamp - bc_lastrequest) > BC_REQUESTTIME) {
|
||||
broadcast_send (NULL, NULL);
|
||||
bc_lastrequest = timestamp;
|
||||
}
|
||||
|
||||
pgi = (struct pkg_gameinfo*) &indata;
|
||||
pgi->gamename[0] = 0;
|
||||
addr.port[0] = addr.host[0] = 0;
|
||||
inlen = udp_get (bman.sock, indata, MAX_UDPDATA, &addr.sAddr, bman.net_ai_family);
|
||||
if (inlen > 0)
|
||||
dns_filladdr (addr.host, LEN_SERVERNAME, addr.port, LEN_PORT, bman.net_ai_family,
|
||||
&addr.sAddr);
|
||||
|
||||
while (inlen > 0) {
|
||||
|
||||
if (pgi->gamename[0] != 0 && pgi->broadcast) {
|
||||
int nr;
|
||||
|
||||
nr = broadcast_find (addr.host, addr.port);
|
||||
if (nr == -1)
|
||||
nr = broadcast_findfree ();
|
||||
if (nr < BC_MAXENTRYS) {
|
||||
strncpy (broadcast_list[nr].host, addr.host, LEN_SERVERNAME);
|
||||
strncpy (broadcast_list[nr].port, addr.port, LEN_PORT);
|
||||
strncpy (broadcast_list[nr].version, pgi->version, LEN_VERSION);
|
||||
strncpy (broadcast_list[nr].gamename, pgi->gamename, LEN_GAMENAME);
|
||||
|
||||
d_printf ("broadcast_loop: Add: nr:%d game:%s %s:%s\n", nr,
|
||||
broadcast_list[nr].gamename, broadcast_list[nr].host,
|
||||
broadcast_list[nr].port);
|
||||
broadcast_list[nr].timestamp = timestamp;
|
||||
}
|
||||
}
|
||||
|
||||
pgi->gamename[0] = 0;
|
||||
addr.port[0] = addr.host[0] = 0;
|
||||
inlen = udp_get (bman.sock, indata, MAX_UDPDATA, &addr.sAddr, bman.net_ai_family);
|
||||
if (inlen > 0)
|
||||
dns_filladdr (addr.host, LEN_SERVERNAME, addr.port, LEN_PORT, bman.net_ai_family,
|
||||
&addr.sAddr);
|
||||
}
|
||||
|
||||
broadcast_check ();
|
||||
|
||||
};
|
Loading…
Reference in new issue