mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-31 00:30:57 +00:00
make sure reply packets go out the same interface they cam in on.
This breaks win32 builds :/
This commit is contained in:
parent
403af77038
commit
599e0f4b0a
1 changed files with 35 additions and 20 deletions
|
@ -63,12 +63,6 @@ static const char rcsid[] =
|
||||||
|
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define S2C_CHALLENGE 'c'
|
|
||||||
#define S2M_HEARTBEAT 'a'
|
|
||||||
#define S2M_SHUTDOWN 'C'
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MASTER_TIMEOUT 300
|
#define MASTER_TIMEOUT 300
|
||||||
#define SLIST_MULTIPLE 1
|
#define SLIST_MULTIPLE 1
|
||||||
|
|
||||||
|
@ -177,10 +171,11 @@ QW_HeartShutdown (struct sockaddr_in *addr, server_t *servers,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
QW_SendHearts (int sock, struct sockaddr_in *addr, server_t *servers,
|
QW_SendHearts (int sock, struct msghdr *msghdr, server_t *servers,
|
||||||
int serverlen)
|
int serverlen)
|
||||||
{
|
{
|
||||||
unsigned char *out;
|
unsigned char *out;
|
||||||
|
struct iovec iovec;
|
||||||
int count, cpos;
|
int count, cpos;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -212,19 +207,24 @@ QW_SendHearts (int sock, struct sockaddr_in *addr, server_t *servers,
|
||||||
++cpos;
|
++cpos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sendto (sock, out, (count + 1) * 6, 0, (struct sockaddr *) addr,
|
iovec.iov_base = out;
|
||||||
sizeof (struct sockaddr_in));
|
iovec.iov_len = (count + 1) * 6;
|
||||||
|
msghdr->msg_iov = &iovec;
|
||||||
|
msghdr->msg_iovlen = 1;
|
||||||
|
sendmsg (sock, msghdr, 0);
|
||||||
free (out);
|
free (out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
QW_Pong (int sock, struct sockaddr_in *addr)
|
QW_Pong (int sock, struct msghdr *msghdr)
|
||||||
{
|
{
|
||||||
// connectionless pa cket
|
// connectionless pa cket
|
||||||
char data[6] = {0xFF, 0xFF, 0xFF, 0xFF, A2A_ACK, 0};
|
char data[6] = {0xFF, 0xFF, 0xFF, 0xFF, A2A_ACK, 0};
|
||||||
printf ("Ping\n");
|
struct iovec iovec = {data, sizeof (data)};
|
||||||
sendto (sock, data, sizeof (data), 0,
|
//printf ("Ping\n");
|
||||||
(struct sockaddr *) addr, sizeof (struct sockaddr_in));
|
msghdr->msg_iov = &iovec;
|
||||||
|
msghdr->msg_iovlen = 1;
|
||||||
|
sendmsg (sock, msghdr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int serverlen = SLIST_MULTIPLE;
|
int serverlen = SLIST_MULTIPLE;
|
||||||
|
@ -234,6 +234,7 @@ void
|
||||||
QW_Master (struct sockaddr_in *addr)
|
QW_Master (struct sockaddr_in *addr)
|
||||||
{
|
{
|
||||||
int sock;
|
int sock;
|
||||||
|
int ip_pktinfo = 1;
|
||||||
|
|
||||||
if (!servers) {
|
if (!servers) {
|
||||||
printf ("initial malloc failed\n");
|
printf ("initial malloc failed\n");
|
||||||
|
@ -246,22 +247,36 @@ QW_Master (struct sockaddr_in *addr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (setsockopt (sock, SOL_IP, IP_PKTINFO, &ip_pktinfo, sizeof (ip_pktinfo))
|
||||||
|
== -1) {
|
||||||
|
perror ("setsockopt");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (bind (sock, (struct sockaddr *) addr, sizeof (struct sockaddr_in))) {
|
if (bind (sock, (struct sockaddr *) addr, sizeof (struct sockaddr_in))) {
|
||||||
printf ("bind failed\n");
|
printf ("bind failed\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
listen (sock, 4); // probably don't need this.
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
char buf[31];
|
char buf[31];
|
||||||
|
struct iovec iovec = {buf, sizeof (buf) - 1};
|
||||||
struct sockaddr_in recvaddr;
|
struct sockaddr_in recvaddr;
|
||||||
int recvsize = sizeof (struct sockaddr_in);
|
char ancillary[CMSG_SPACE (sizeof (struct in_pktinfo))];
|
||||||
|
struct msghdr msghdr = {
|
||||||
|
&recvaddr,
|
||||||
|
sizeof (recvaddr),
|
||||||
|
&iovec,
|
||||||
|
1,
|
||||||
|
ancillary,
|
||||||
|
sizeof (ancillary),
|
||||||
|
0
|
||||||
|
};
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
buf[30] = '\0'; // a sentinal for string ops
|
buf[30] = '\0'; // a sentinal for string ops
|
||||||
|
|
||||||
size = recvfrom (sock, buf, sizeof (buf) - 1, 0,
|
size = recvmsg (sock, &msghdr, 0);
|
||||||
(struct sockaddr *) &recvaddr, &recvsize);
|
|
||||||
if (size == -1) {
|
if (size == -1) {
|
||||||
printf ("recvfrom failed\n");
|
printf ("recvfrom failed\n");
|
||||||
continue;
|
continue;
|
||||||
|
@ -291,7 +306,7 @@ QW_Master (struct sockaddr_in *addr)
|
||||||
QW_TimeoutHearts (servers, serverlen);
|
QW_TimeoutHearts (servers, serverlen);
|
||||||
switch (buf[0]) {
|
switch (buf[0]) {
|
||||||
case S2C_CHALLENGE:
|
case S2C_CHALLENGE:
|
||||||
QW_SendHearts (sock, &recvaddr, servers, serverlen);
|
QW_SendHearts (sock, &msghdr, servers, serverlen);
|
||||||
break;
|
break;
|
||||||
case S2M_HEARTBEAT:
|
case S2M_HEARTBEAT:
|
||||||
serverlen = QW_AddHeartbeat (&servers, serverlen,
|
serverlen = QW_AddHeartbeat (&servers, serverlen,
|
||||||
|
@ -301,7 +316,7 @@ QW_Master (struct sockaddr_in *addr)
|
||||||
QW_HeartShutdown (&recvaddr, servers, serverlen);
|
QW_HeartShutdown (&recvaddr, servers, serverlen);
|
||||||
break;
|
break;
|
||||||
case A2A_PING:
|
case A2A_PING:
|
||||||
QW_Pong (sock, &recvaddr);
|
QW_Pong (sock, &msghdr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf ("Unknown 0x%x\n", buf[0]);
|
printf ("Unknown 0x%x\n", buf[0]);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue