mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-31 00:30:57 +00:00
clean up the mess of {send,recv}msg vs {sendto,recvfrom}
This commit is contained in:
parent
4ac2fc0a52
commit
ed0342e996
1 changed files with 82 additions and 78 deletions
|
@ -66,6 +66,78 @@ static const char rcsid[] =
|
||||||
|
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_UIO_H
|
||||||
|
static int
|
||||||
|
qf_sendmsg (int sock, void *data, size_t len, struct msghdr *msghdr)
|
||||||
|
{
|
||||||
|
struct iovec iovec = {data, len};
|
||||||
|
msghdr->msg_iov = &iovec;
|
||||||
|
msghdr->msg_iovlen = 1;
|
||||||
|
return sendmsg (sock, msghdr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
qf_recvmsg (int sock, void *data, size_t len, struct msghdr *msghdr)
|
||||||
|
{
|
||||||
|
struct iovec iovec = {data, len};
|
||||||
|
msghdr->msg_iov = &iovec;
|
||||||
|
msghdr->msg_iovlen = 1;
|
||||||
|
return recvmsg (sock, msghdr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
qf_initsocket (int sock)
|
||||||
|
{
|
||||||
|
int ip_pktinfo = 1;
|
||||||
|
if (setsockopt (sock, SOL_IP, IP_PKTINFO, &ip_pktinfo,
|
||||||
|
sizeof (ip_pktinfo)) == -1) {
|
||||||
|
perror ("setsockopt");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MSGHDR \
|
||||||
|
char ancillary[CMSG_SPACE (sizeof (struct in_pktinfo))]; \
|
||||||
|
struct sockaddr_in recvaddr; \
|
||||||
|
struct msghdr msghdr = { \
|
||||||
|
&recvaddr, \
|
||||||
|
sizeof (recvaddr), \
|
||||||
|
0, 0, \
|
||||||
|
ancillary, \
|
||||||
|
sizeof (ancillary), \
|
||||||
|
0 \
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct msghdr msghdr_t;
|
||||||
|
|
||||||
|
#else
|
||||||
|
static int
|
||||||
|
qf_sendmsg (int sock, void *data, size_t len, struct sockaddr_in *addr)
|
||||||
|
{
|
||||||
|
return sendto (sock, data, len, 0, (struct sockaddr *)addr, sizeof (*addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
qf_recvmsg (int sock, void *data, size_t len, struct sockaddr_in *addr)
|
||||||
|
{
|
||||||
|
size_t addr_len;
|
||||||
|
return recvfrom (sock, data, len, 0, (struct sockaddr *)addr, &addr_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
qf_initsocket (int sock)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MSGHDR struct sockaddr_in msghdr
|
||||||
|
#define recvaddr msghdr
|
||||||
|
|
||||||
|
typedef struct sockaddr_in msghdr_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MASTER_TIMEOUT 300
|
#define MASTER_TIMEOUT 300
|
||||||
#define SLIST_MULTIPLE 1
|
#define SLIST_MULTIPLE 1
|
||||||
|
|
||||||
|
@ -173,20 +245,10 @@ QW_HeartShutdown (struct sockaddr_in *addr, server_t *servers,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SYS_UIO_H
|
|
||||||
void
|
void
|
||||||
QW_SendHearts (int sock, struct msghdr *msghdr, server_t *servers,
|
QW_SendHearts (int sock, msghdr_t *msghdr, server_t *servers, int serverlen)
|
||||||
int serverlen)
|
|
||||||
#else
|
|
||||||
void
|
|
||||||
QW_SendHearts (int sock, struct sockaddr_in *addr, server_t *servers,
|
|
||||||
int serverlen)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
unsigned char *out;
|
unsigned char *out;
|
||||||
#ifdef HAVE_SYS_UIO_H
|
|
||||||
struct iovec iovec;
|
|
||||||
#endif
|
|
||||||
int count, cpos;
|
int count, cpos;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -218,39 +280,17 @@ QW_SendHearts (int sock, struct sockaddr_in *addr, server_t *servers,
|
||||||
++cpos;
|
++cpos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef HAVE_SYS_UIO_H
|
qf_sendmsg (sock, out, (count + 1) * 6, msghdr);
|
||||||
iovec.iov_base = out;
|
|
||||||
iovec.iov_len = (count + 1) * 6;
|
|
||||||
msghdr->msg_iov = &iovec;
|
|
||||||
msghdr->msg_iovlen = 1;
|
|
||||||
sendmsg (sock, msghdr, 0);
|
|
||||||
#else
|
|
||||||
sendto (sock, out, (count + 1) * 6, 0,
|
|
||||||
(struct sockaddr *)addr, sizeof (*addr));
|
|
||||||
#endif
|
|
||||||
free (out);
|
free (out);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SYS_UIO_H
|
|
||||||
void
|
void
|
||||||
QW_Pong (int sock, struct msghdr *msghdr)
|
QW_Pong (int sock, msghdr_t *msghdr)
|
||||||
#else
|
|
||||||
void
|
|
||||||
QW_Pong (int sock, struct sockaddr_in *addr)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
// connectionless pa cket
|
// connectionless packet
|
||||||
char data[6] = {0xFF, 0xFF, 0xFF, 0xFF, A2A_ACK, 0};
|
char data[6] = {0xFF, 0xFF, 0xFF, 0xFF, A2A_ACK, 0};
|
||||||
#ifdef HAVE_SYS_UIO_H
|
|
||||||
struct iovec iovec = {data, sizeof (data)};
|
|
||||||
msghdr->msg_iov = &iovec;
|
|
||||||
msghdr->msg_iovlen = 1;
|
|
||||||
sendmsg (sock, msghdr, 0);
|
|
||||||
#else
|
|
||||||
sendto (sock, data, sizeof (data), 0,
|
|
||||||
(struct sockaddr *)addr, sizeof (*addr));
|
|
||||||
#endif
|
|
||||||
//printf ("Ping\n");
|
//printf ("Ping\n");
|
||||||
|
qf_sendmsg (sock, data, sizeof (data), msghdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
int serverlen = SLIST_MULTIPLE;
|
int serverlen = SLIST_MULTIPLE;
|
||||||
|
@ -272,16 +312,8 @@ QW_Master (struct sockaddr_in *addr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SYS_UIO_H
|
if (qf_initsocket (sock) == -1)
|
||||||
{
|
return;
|
||||||
int ip_pktinfo = 1;
|
|
||||||
if (setsockopt (sock, SOL_IP, IP_PKTINFO, &ip_pktinfo,
|
|
||||||
sizeof (ip_pktinfo)) == -1) {
|
|
||||||
perror ("setsockopt");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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");
|
||||||
|
@ -289,35 +321,15 @@ QW_Master (struct sockaddr_in *addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
struct sockaddr_in recvaddr;
|
|
||||||
int size;
|
int size;
|
||||||
char buf[31];
|
char buf[31];
|
||||||
#ifdef HAVE_SYS_UIO_H
|
MSGHDR;
|
||||||
struct iovec iovec = {buf, sizeof (buf) - 1};
|
|
||||||
char ancillary[CMSG_SPACE (sizeof (struct in_pktinfo))];
|
|
||||||
struct msghdr msghdr = {
|
|
||||||
&recvaddr,
|
|
||||||
sizeof (recvaddr),
|
|
||||||
&iovec,
|
|
||||||
1,
|
|
||||||
ancillary,
|
|
||||||
sizeof (ancillary),
|
|
||||||
0
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
size_t recvaddrlen = sizeof (recvaddr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
buf[30] = '\0'; // a sentinal for string ops
|
buf[30] = '\0'; // a sentinal for string ops
|
||||||
|
|
||||||
#ifdef HAVE_SYS_UIO_H
|
size = qf_recvmsg (sock, buf, sizeof (buf) - 1, &msghdr);
|
||||||
size = recvmsg (sock, &msghdr, 0);
|
|
||||||
#else
|
|
||||||
size = recvfrom (sock, buf, sizeof (buf) - 1, 0,
|
|
||||||
(struct sockaddr *)&recvaddr, &recvaddrlen);
|
|
||||||
#endif
|
|
||||||
if (size == -1) {
|
if (size == -1) {
|
||||||
printf ("recvfrom failed\n");
|
perror ("qf_recvmsg failed\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -345,11 +357,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:
|
||||||
#ifdef HAVE_SYS_UIO_H
|
|
||||||
QW_SendHearts (sock, &msghdr, servers, serverlen);
|
QW_SendHearts (sock, &msghdr, servers, serverlen);
|
||||||
#else
|
|
||||||
QW_SendHearts (sock, &recvaddr, servers, serverlen);
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case S2M_HEARTBEAT:
|
case S2M_HEARTBEAT:
|
||||||
serverlen = QW_AddHeartbeat (&servers, serverlen,
|
serverlen = QW_AddHeartbeat (&servers, serverlen,
|
||||||
|
@ -359,11 +367,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:
|
||||||
#ifdef HAVE_SYS_UIO_H
|
|
||||||
QW_Pong (sock, &msghdr);
|
QW_Pong (sock, &msghdr);
|
||||||
#else
|
|
||||||
QW_Pong (sock, &recvaddr);
|
|
||||||
#endif
|
|
||||||
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