mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-06-01 17:12:15 +00:00
idontthinkimobsessivedoyouthinkimobsessive?
This commit is contained in:
parent
f2cf4388d9
commit
ce7e6ac4a5
1 changed files with 58 additions and 38 deletions
|
@ -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;
|
||||||
|
@ -184,8 +196,8 @@ QW_SendHearts (int sock, struct sockaddr_in *addr,
|
||||||
++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,7 +205,7 @@ 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,6 +246,7 @@ 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);
|
||||||
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue