idontthinkimobsessivedoyouthinkimobsessive?

This commit is contained in:
Adam Olsen 2001-09-18 08:58:51 +00:00
parent f2cf4388d9
commit ce7e6ac4a5

View file

@ -56,9 +56,9 @@
#define S2M_HEARTBEAT 'a' #define S2M_HEARTBEAT 'a'
#define S2M_SHUTDOWN 'C' #define S2M_SHUTDOWN 'C'
#endif #endif
#ifndef MASTER_TIMEOUT
# define MASTER_TIMEOUT 300 #define MASTER_TIMEOUT 300
#endif #define SLIST_MULTIPLE 1
typedef struct { typedef struct {
struct sockaddr_in addr; struct sockaddr_in addr;
@ -66,18 +66,22 @@ typedef struct {
} server_t; } server_t;
int int
QW_AddHeartbeat (server_t **servers_p, int slen, struct sockaddr_in *addr, char *buf) QW_AddHeartbeat (server_t **servers_p, int slen,
struct sockaddr_in *addr, char *buf)
{ {
server_t *servers = *servers_p; server_t *servers = *servers_p;
int freeslot = -1; int freeslot = -1;
int i; int i;
int sequence, players; int sequence, players;
char *c;
sequence = atoi (buf + 2); sequence = atoi (buf + 2);
players = atoi (strchr (buf + 2, '\n') + 1); c = strchr (buf + 2, '\n');
players = c ? atoi (c + 1) : 0;
for (i = 0; i < slen; i++) { for (i = 0; i < slen; i++) {
if (servers[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr if (servers[i].updated
&& servers[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr
&& servers[i].addr.sin_port == addr->sin_port) { && servers[i].addr.sin_port == addr->sin_port) {
time (&servers[i].updated); time (&servers[i].updated);
#if 1 #if 1
@ -93,16 +97,18 @@ QW_AddHeartbeat (server_t **servers_p, int slen, struct sockaddr_in *addr, char
} }
if (freeslot == -1) { if (freeslot == -1) {
server_t *newservers; server_t *newservers;
newservers = realloc (servers, sizeof (server_t) * (slen + 50)); newservers = realloc (servers, sizeof (server_t)
* (slen + SLIST_MULTIPLE));
if (!newservers) { if (!newservers) {
printf ("realloc failed\n");
return slen; // boo. return slen; // boo.
} }
for (i = slen; i < slen + 50; i++) {
for (i = slen; i < slen + SLIST_MULTIPLE; i++)
newservers[i].updated = 0; newservers[i].updated = 0;
}
memcpy (newservers, servers, slen * sizeof (server_t));
freeslot = slen; freeslot = slen;
slen += 50; slen += SLIST_MULTIPLE;
*servers_p = newservers; *servers_p = newservers;
} }
servers[freeslot].addr = *addr; servers[freeslot].addr = *addr;
@ -136,7 +142,9 @@ QW_TimeoutHearts (server_t *servers, int slen)
} }
void void
QW_HeartShutdown (struct sockaddr_in *addr,server_t *servers, int slen) { QW_HeartShutdown (struct sockaddr_in *addr, server_t *servers,
int slen)
{
int i; int i;
for (i = 0; i < slen; i++) { for (i = 0; i < slen; i++) {
if (servers[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr if (servers[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr
@ -153,8 +161,8 @@ QW_HeartShutdown (struct sockaddr_in *addr,server_t *servers, int slen) {
} }
void void
QW_SendHearts (int sock, struct sockaddr_in *addr, QW_SendHearts (int sock, struct sockaddr_in *addr, server_t *servers,
server_t *servers, int serverlen) int serverlen)
{ {
unsigned char *out; unsigned char *out;
int count, cpos; int count, cpos;
@ -162,11 +170,15 @@ QW_SendHearts (int sock, struct sockaddr_in *addr,
count = 0; count = 0;
for (i = 0; i < serverlen; i++) { for (i = 0; i < serverlen; i++)
if (servers[i].updated != 0) if (servers[i].updated != 0)
count++; count++;
}
out = malloc ((count + 1) * 6); out = malloc ((count + 1) * 6);
if (!out) {
printf ("malloc failed\n");
return;
}
cpos = 1; cpos = 1;
out[0] = out[1] = out[2] = out[3] = 0xff; out[0] = out[1] = out[2] = out[3] = 0xff;
out[4] = 0x64; out[4] = 0x64;
@ -175,17 +187,17 @@ QW_SendHearts (int sock, struct sockaddr_in *addr,
for (i = 0; i < serverlen; i++) { for (i = 0; i < serverlen; i++) {
if (servers[i].updated != 0) { if (servers[i].updated != 0) {
unsigned char *p = out + (cpos * 6); unsigned char *p = out + (cpos * 6);
p[0] = ((unsigned char*) &servers[i].addr.sin_addr.s_addr)[0]; p[0] = ((unsigned char *) &servers[i].addr.sin_addr.s_addr)[0];
p[1] = ((unsigned char*) &servers[i].addr.sin_addr.s_addr)[1]; p[1] = ((unsigned char *) &servers[i].addr.sin_addr.s_addr)[1];
p[2] = ((unsigned char*) &servers[i].addr.sin_addr.s_addr)[2]; p[2] = ((unsigned char *) &servers[i].addr.sin_addr.s_addr)[2];
p[3] = ((unsigned char*) &servers[i].addr.sin_addr.s_addr)[3]; p[3] = ((unsigned char *) &servers[i].addr.sin_addr.s_addr)[3];
p[4] = (unsigned char) (ntohs(servers[i].addr.sin_port) >> 8); p[4] = (unsigned char) (ntohs(servers[i].addr.sin_port) >> 8);
p[5] = (unsigned char) (ntohs(servers[i].addr.sin_port) & 0xFF); p[5] = (unsigned char) (ntohs(servers[i].addr.sin_port) & 0xFF);
++cpos; ++cpos;
} }
} }
sendto (sock, out, (count + 1) * 6, 0, sendto (sock, out, (count + 1) * 6, 0, (struct sockaddr *) addr,
(struct sockaddr*) addr, sizeof (struct sockaddr_in)); sizeof (struct sockaddr_in));
free (out); free (out);
} }
@ -193,9 +205,9 @@ void
QW_Pong (int sock, struct sockaddr_in *addr) QW_Pong (int sock, struct sockaddr_in *addr)
{ {
char data[6] = {0xFF, 0xFF, 0xFF, 0xFF, A2A_ACK, 0}; char data[6] = {0xFF, 0xFF, 0xFF, 0xFF, A2A_ACK, 0};
printf ("ping\n"); printf ("Ping\n");
sendto (sock, data, sizeof (data), 0, sendto (sock, data, sizeof (data), 0,
(struct sockaddr*) addr, sizeof (struct sockaddr_in)); (struct sockaddr *) addr, sizeof (struct sockaddr_in));
} }
@ -203,23 +215,29 @@ void
QW_Master (struct sockaddr_in *addr) QW_Master (struct sockaddr_in *addr)
{ {
int sock; int sock;
server_t *servers = malloc (sizeof (server_t) * 50); server_t *servers;
int serverlen = 50; int serverlen = SLIST_MULTIPLE;
int i; int i;
if (servers == NULL) servers = malloc (sizeof (server_t) * serverlen);
if (!servers) {
printf ("initial malloc failed\n");
return; return;
for (i = 0; i < 50; i++) {
servers[i].updated = 0;
} }
sock = socket (AF_INET,SOCK_DGRAM, 0); for (i = 0; i < serverlen; i++)
if (sock < 0) servers[i].updated = 0;
return;
if (bind (sock, (struct sockaddr*)addr, sizeof (struct sockaddr_in))) sock = socket (AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
printf ("socket failed\n");
return; return;
}
if (bind (sock, (struct sockaddr *) addr, sizeof (struct sockaddr_in))) {
printf ("bind failed\n");
return;
}
listen (sock, 4); // probably don't need this. listen (sock, 4); // probably don't need this.
@ -228,9 +246,10 @@ QW_Master (struct sockaddr_in *addr)
struct sockaddr_in recvaddr; struct sockaddr_in recvaddr;
int recvsize = sizeof (struct sockaddr_in); int recvsize = sizeof (struct sockaddr_in);
int size; int size;
buf[30] = '\0'; // a sentinal for string ops
size = recvfrom (sock, buf, sizeof (buf) - 1, 0, size = recvfrom (sock, buf, sizeof (buf) - 1, 0,
(struct sockaddr*) &recvaddr, &recvsize); (struct sockaddr *) &recvaddr, &recvsize);
if (size == -1) { if (size == -1) {
printf ("recvfrom failed\n"); printf ("recvfrom failed\n");
continue; continue;
@ -247,7 +266,7 @@ QW_Master (struct sockaddr_in *addr)
for (j = 0; j < size; j++) for (j = 0; j < size; j++)
if (isprint (buf[j])) if (isprint (buf[j]))
printf ("%c", buf[j]); printf ("%c", buf[j]);
else { else
switch (buf[j]) { switch (buf[j]) {
case '\n': printf ("\\n"); break; case '\n': printf ("\\n"); break;
case '\0': printf ("\\0"); break; case '\0': printf ("\\0"); break;
@ -263,7 +282,8 @@ QW_Master (struct sockaddr_in *addr)
QW_SendHearts (sock, &recvaddr, servers, serverlen); QW_SendHearts (sock, &recvaddr, servers, serverlen);
break; break;
case S2M_HEARTBEAT: case S2M_HEARTBEAT:
serverlen = QW_AddHeartbeat (&servers, serverlen, &recvaddr, buf); serverlen = QW_AddHeartbeat (&servers, serverlen,
&recvaddr, buf);
break; break;
case S2M_SHUTDOWN: case S2M_SHUTDOWN:
QW_HeartShutdown (&recvaddr, servers, serverlen); QW_HeartShutdown (&recvaddr, servers, serverlen);