2
0
mirror of https://github.com/rehlds/rehlds.git synced 2024-12-27 23:25:45 +03:00

Refactoring and fixes in net_ws (#567)

This commit is contained in:
In-line 2018-01-18 15:13:38 +04:00 committed by theAsmodai
parent a8f4f03e3e
commit 923c838807
3 changed files with 142 additions and 203 deletions

View File

@ -127,17 +127,19 @@ void NetadrToSockadr(const netadr_t *a, struct sockaddr *s)
{
Q_memset(s, 0, sizeof(*s));
auto s_in = (sockaddr_in *)s;
switch (a->type)
{
case NA_BROADCAST:
((struct sockaddr_in *)s)->sin_family = AF_INET;
((struct sockaddr_in *)s)->sin_addr.s_addr = INADDR_BROADCAST;
((struct sockaddr_in *)s)->sin_port = a->port;
s_in->sin_family = AF_INET;
s_in->sin_addr.s_addr = INADDR_BROADCAST;
s_in->sin_port = a->port;
break;
case NA_IP:
((struct sockaddr_in *)s)->sin_family = AF_INET;
((struct sockaddr_in *)s)->sin_addr.s_addr = *(int *)&a->ip;
((struct sockaddr_in *)s)->sin_port = a->port;
s_in->sin_family = AF_INET;
s_in->sin_addr.s_addr = *(int *)&a->ip;
s_in->sin_port = a->port;
break;
#ifdef _WIN32
case NA_IPX:
@ -349,68 +351,26 @@ char *NET_BaseAdrToString(netadr_t& a)
qboolean NET_StringToSockaddr(const char *s, struct sockaddr *sadr)
{
struct hostent *h;
char *colon;
int val;
char copy[128];
Q_memset(sadr, 0, sizeof(*sadr));
#ifdef _WIN32
// IPX support.
if (Q_strlen(s) >= 24 && s[8] == ':' && s[21] == ':')
{
sadr->sa_family = AF_IPX;
copy[2] = 0;
copy[0] = s[0];
copy[1] = s[1];
sscanf(copy, "%x", &val);
sadr->sa_data[0] = (char)val;
copy[0] = s[2];
copy[1] = s[3];
sscanf(copy, "%x", &val);
sadr->sa_data[1] = (char)val;
copy[0] = s[4];
copy[1] = s[5];
sscanf(copy, "%x", &val);
sadr->sa_data[2] = (char)val;
copy[0] = s[6];
copy[1] = s[7];
sscanf(copy, "%x", &val);
sadr->sa_data[3] = (char)val;
copy[0] = s[9];
copy[1] = s[10];
sscanf(copy, "%x", &val);
sadr->sa_data[4] = (char)val;
copy[0] = s[11];
copy[1] = s[12];
sscanf(copy, "%x", &val);
sadr->sa_data[5] = (char)val;
copy[0] = s[13];
copy[1] = s[14];
sscanf(copy, "%x", &val);
sadr->sa_data[6] = (char)val;
copy[0] = s[15];
copy[1] = s[16];
sscanf(copy, "%x", &val);
sadr->sa_data[7] = (char)val;
copy[0] = s[17];
copy[1] = s[18];
sscanf(copy, "%x", &val);
sadr->sa_data[8] = (char)val;
copy[0] = s[19];
copy[1] = s[20];
sscanf(copy, "%x", &val);
sadr->sa_data[9] = (char)val;
int val = 0;
for(int i = 0; i < 20; i+=2)
{
if (s[i] == ':')
{
--i; // Skip one char on next iteration.
continue;
}
// Convert from hexademical represantation to sockaddr
char temp[3] = { s[i], s[i + 1], '\0' };
sscanf(temp, "%x", &val);
sadr->sa_data[i / 2] = (char)val;
}
sscanf(s + 22, "%u", &val);
*(uint16 *)&sadr->sa_data[10] = htons(val);
@ -419,36 +379,38 @@ qboolean NET_StringToSockaddr(const char *s, struct sockaddr *sadr)
}
#endif // _WIN32
((sockaddr_in *)sadr)->sin_family = AF_INET;
((sockaddr_in *)sadr)->sin_port = 0;
auto *sadr_in = (sockaddr_in *)sadr;
sadr_in->sin_family = AF_INET;
char copy[128];
Q_strncpy(copy, s, sizeof(copy) - 1);
copy[sizeof(copy) - 1] = 0;
// Parse port
colon = copy;
while (*colon != 0)
char *colon = Q_strchr(copy, ':');
if(colon != nullptr)
{
if (*colon == ':')
{
*colon = 0;
val = Q_atoi(colon + 1);
((sockaddr_in *)sadr)->sin_port = htons(val);
}
colon++;
*colon = '\0';
sadr_in->sin_port = htons(Q_atoi(colon + 1));
}
else
{
sadr_in->sin_port = 0;
}
// Parse address
((sockaddr_in *)sadr)->sin_addr.s_addr = inet_addr(copy);
if (((sockaddr_in *)sadr)->sin_addr.s_addr == INADDR_NONE)
sadr_in->sin_addr.s_addr = inet_addr(copy);
if (sadr_in->sin_addr.s_addr == INADDR_NONE)
{
h = CRehldsPlatformHolder::get()->gethostbyname(copy);
struct hostent *host = CRehldsPlatformHolder::get()->gethostbyname(copy);
if (h == NULL || h->h_addr == NULL)
if (host == nullptr || host->h_addr == nullptr)
{
return FALSE;
}
((sockaddr_in *)sadr)->sin_addr.s_addr = *(uint32 *)h->h_addr;
sadr_in->sin_addr.s_addr = *(uint32 *)host->h_addr;
}
return TRUE;
}
@ -563,10 +525,7 @@ void NET_TransferRawData(sizebuf_t *msg, unsigned char *pStart, int nSize)
qboolean NET_GetLoopPacket(netsrc_t sock, netadr_t *in_from_, sizebuf_t *msg)
{
int i;
loopback_t *loop;
loop = &loopbacks[sock];
loopback_t *loop = &loopbacks[sock];
if (loop->send - loop->get > 4)
{
@ -575,7 +534,7 @@ qboolean NET_GetLoopPacket(netsrc_t sock, netadr_t *in_from_, sizebuf_t *msg)
if (loop->get < loop->send)
{
i = loop->get & (MAX_LOOPBACK - 1);
int i = loop->get & (MAX_LOOPBACK - 1);
loop->get++;
NET_TransferRawData(msg, loop->msgs[i].data, loop->msgs[i].datalen);
@ -590,14 +549,11 @@ qboolean NET_GetLoopPacket(netsrc_t sock, netadr_t *in_from_, sizebuf_t *msg)
void NET_SendLoopPacket(netsrc_t sock, int length, void *data, const netadr_t& to)
{
int i;
loopback_t *loop;
NET_ThreadLock();
loop = &loopbacks[sock ^ 1];
loopback_t *loop = &loopbacks[sock ^ 1];
i = loop->send & (MAX_LOOPBACK - 1);
int i = loop->send & (MAX_LOOPBACK - 1);
loop->send++;
#ifdef REHLDS_CHECKS
@ -625,15 +581,10 @@ NOXREF int NET_CountLaggedList(packetlag_t *pList)
{
NOXREFCHECK;
int c;
packetlag_t *p;
c = 0;
p = pList->pNext;
while (p && p != pList)
int c = 0;
for (packetlag_t* p = pList->pNext; p && p != pList; p = p->pNext)
{
c++;
p = p->pNext;
}
return c;
@ -641,12 +592,10 @@ NOXREF int NET_CountLaggedList(packetlag_t *pList)
void NET_ClearLaggedList(packetlag_t *pList)
{
packetlag_t *p, *n;
p = pList->pNext;
packetlag_t *p = pList->pNext;
while (p && p != pList)
{
n = p->pNext;
packetlag_t *n = p->pNext;
NET_RemoveFromPacketList(p);
if (p->pPacketData)
{
@ -687,11 +636,8 @@ void NET_AddToLagged(netsrc_t sock, packetlag_t *pList, packetlag_t *pPacket, ne
void NET_AdjustLag()
{
static double lasttime = realtime;
double dt;
float diff;
float converge;
dt = realtime - lasttime;
double dt = realtime - lasttime;
if (dt <= 0.0)
{
dt = 0.0;
@ -709,8 +655,8 @@ void NET_AdjustLag()
{
if (fakelag.value != gFakeLag)
{
diff = fakelag.value - gFakeLag;
converge = dt * 200.0;
float diff = fakelag.value - gFakeLag;
float converge = dt * 200.0;
if (fabs(diff) < converge)
converge = fabs(diff);
if (diff < 0.0)
@ -728,19 +674,13 @@ void NET_AdjustLag()
qboolean NET_LagPacket(qboolean newdata, netsrc_t sock, netadr_t *from, sizebuf_t *data)
{
packetlag_t *pNewPacketLag;
packetlag_t *pPacket;
float curtime;
int ninterval;
static int losscount[NS_MAX];
if (gFakeLag <= 0.0)
{
NET_ClearLagData(TRUE, TRUE);
return newdata;
}
curtime = realtime;
float curtime = realtime;
#ifdef REHLDS_FIXES
if (newdata && data)
#else
@ -751,10 +691,11 @@ qboolean NET_LagPacket(qboolean newdata, netsrc_t sock, netadr_t *from, sizebuf_
{
if (allow_cheats)
{
static int losscount[NS_MAX] = {};
++losscount[sock];
if (fakeloss.value <= 0.0f)
{
ninterval = fabs(fakeloss.value);
int ninterval = fabs(fakeloss.value);
if (ninterval < 2)
ninterval = 2;
if ((losscount[sock] % ninterval) == 0)
@ -772,11 +713,11 @@ qboolean NET_LagPacket(qboolean newdata, netsrc_t sock, netadr_t *from, sizebuf_
}
}
pNewPacketLag = (packetlag_t *)Mem_ZeroMalloc(sizeof(packetlag_t));
packetlag_t *pNewPacketLag = (packetlag_t *)Mem_ZeroMalloc(sizeof(packetlag_t));
NET_AddToLagged(sock, &g_pLagData[sock], pNewPacketLag, from, *data, curtime);
}
pPacket = g_pLagData[sock].pNext;
packetlag_t *pPacket = g_pLagData[sock].pNext;
while (pPacket != &g_pLagData[sock])
{
@ -801,14 +742,13 @@ qboolean NET_LagPacket(qboolean newdata, netsrc_t sock, netadr_t *from, sizebuf_
void NET_FlushSocket(netsrc_t sock)
{
struct sockaddr from;
socklen_t fromlen;
SOCKET net_socket;
unsigned char buf[MAX_UDP_PACKET];
net_socket = ip_sockets[sock];
SOCKET net_socket = ip_sockets[sock];
if (net_socket != INV_SOCK)
{
struct sockaddr from;
socklen_t fromlen;
unsigned char buf[MAX_UDP_PACKET];
fromlen = 16;
while (CRehldsPlatformHolder::get()->recvfrom(net_socket, (char*)buf, sizeof buf, 0, &from, &fromlen) > 0)
;
@ -817,23 +757,20 @@ void NET_FlushSocket(netsrc_t sock)
qboolean NET_GetLong(unsigned char *pData, int size, int *outSize)
{
unsigned int packetNumber;
unsigned int packetCount;
int sequenceNumber;
unsigned char packetID;
static int gNetSplitFlags[NET_WS_MAX_FRAGMENTS];
SPLITPACKET *pHeader = (SPLITPACKET *) pData;
sequenceNumber = pHeader->sequenceNumber;
packetID = pHeader->packetID;
packetCount = packetID & 0xF;
packetNumber = (unsigned int)packetID >> 4;
int sequenceNumber = pHeader->sequenceNumber;
unsigned char packetID = pHeader->packetID;
unsigned int packetCount = packetID & 0xF;
unsigned int packetNumber = (unsigned int)packetID >> 4;
if (packetNumber >= NET_WS_MAX_FRAGMENTS || packetCount > NET_WS_MAX_FRAGMENTS)
{
Con_NetPrintf("Malformed packet number (%i/%i)\n", packetNumber + 1, packetCount);
return FALSE;
}
if (gNetSplit.currentSequence == -1 || sequenceNumber != gNetSplit.currentSequence)
{
gNetSplit.currentSequence = pHeader->sequenceNumber;
@ -924,18 +861,16 @@ qboolean NET_GetLong(unsigned char *pData, int size, int *outSize)
qboolean NET_QueuePacket(netsrc_t sock)
{
int ret = -1;
struct sockaddr from;
socklen_t fromlen;
SOCKET net_socket;
int protocol;
unsigned char buf[MAX_UDP_PACKET];
#ifdef _WIN32
for (protocol = 0; protocol < 2; protocol++)
for (int protocol = 0; protocol < 2; protocol++)
#else
for (protocol = 0; protocol < 1; protocol++)
for (int protocol = 0; protocol < 1; protocol++)
#endif // _WIN32
{
SOCKET net_socket;
if (protocol == 0)
net_socket = ip_sockets[sock];
#ifdef _WIN32
@ -946,7 +881,8 @@ qboolean NET_QueuePacket(netsrc_t sock)
if (net_socket == INV_SOCK)
continue;
fromlen = sizeof(from);
struct sockaddr from;
socklen_t fromlen = sizeof(from);
ret = CRehldsPlatformHolder::get()->recvfrom(net_socket, (char *)buf, sizeof buf, 0, &from, &fromlen);
if (ret == -1)
{
@ -1082,12 +1018,9 @@ DLL_EXPORT int NET_Sleep_Timeout()
int NET_Sleep()
{
fd_set fdset;
struct timeval tv;
SOCKET number;
FD_ZERO(&fdset);
number = 0;
SOCKET number = 0;
for (int sock = 0; sock < NS_MAX; sock++)
{
SOCKET net_socket = ip_sockets[sock];
@ -1111,6 +1044,7 @@ int NET_Sleep()
#endif // _WIN32
}
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 20 * 1000;
@ -1249,7 +1183,6 @@ void NET_FreeMsg(net_messages_t *pmsg)
qboolean NET_GetPacket(netsrc_t sock)
{
net_messages_t *pmsg;
qboolean bret;
NET_AdjustLag();
@ -1281,7 +1214,7 @@ qboolean NET_GetPacket(netsrc_t sock)
return bret;
}
pmsg = messages[sock];
net_messages_t *pmsg = messages[sock];
if (pmsg)
{
net_message.cursize = pmsg->buffersize;
@ -1298,10 +1231,9 @@ qboolean NET_GetPacket(netsrc_t sock)
void NET_AllocateQueues()
{
net_messages_t *p;
for (int i = 0; i < NUM_MSG_QUEUES; i++)
{
p = (net_messages_t *)Mem_ZeroMalloc(sizeof(net_messages_t));
net_messages_t *p = (net_messages_t *)Mem_ZeroMalloc(sizeof(net_messages_t));
p->buffer = (unsigned char *)Mem_ZeroMalloc(MSG_QUEUE_SIZE);
p->preallocated = TRUE;
p->next = normalqueue;
@ -1348,26 +1280,23 @@ int NET_SendLong(netsrc_t sock, SOCKET s, const char *buf, int len, int flags, c
if (sock == NS_SERVER && len > MAX_ROUTEABLE_PACKET)
{
// yep
char packet[MAX_ROUTEABLE_PACKET];
int totalSent, ret, size, packetCount, packetNumber;
SPLITPACKET *pPacket;
gSequenceNumber++;
if (gSequenceNumber < 0)
{
gSequenceNumber = 1;
}
pPacket = (SPLITPACKET *)packet;
char packet[MAX_ROUTEABLE_PACKET];
SPLITPACKET *pPacket = (SPLITPACKET *)packet;
pPacket->netID = NET_HEADER_FLAG_SPLITPACKET;
pPacket->sequenceNumber = gSequenceNumber;
packetNumber = 0;
totalSent = 0;
packetCount = (len + SPLIT_SIZE - 1) / SPLIT_SIZE;
int packetNumber = 0;
int totalSent = 0;
int packetCount = (len + SPLIT_SIZE - 1) / SPLIT_SIZE;
while (len > 0)
{
size = Q_min(int(SPLIT_SIZE), len);
int size = Q_min(int(SPLIT_SIZE), len);
pPacket->packetID = (packetNumber << 4) + packetCount;
@ -1388,7 +1317,7 @@ int NET_SendLong(netsrc_t sock, SOCKET s, const char *buf, int len, int flags, c
NET_AdrToString(adr));
}
ret = CRehldsPlatformHolder::get()->sendto(s, packet, size + sizeof(SPLITPACKET), flags, to, tolen);
int ret = CRehldsPlatformHolder::get()->sendto(s, packet, size + sizeof(SPLITPACKET), flags, to, tolen);
if (ret < 0)
{
return ret;
@ -1410,6 +1339,7 @@ int NET_SendLong(netsrc_t sock, SOCKET s, const char *buf, int len, int flags, c
return nSend;
}
void EXT_FUNC NET_SendPacket_api(unsigned int length, void *data, const netadr_t &to)
{
NET_SendPacket(NS_SERVER, length, data, to);
@ -1417,16 +1347,13 @@ void EXT_FUNC NET_SendPacket_api(unsigned int length, void *data, const netadr_t
void NET_SendPacket(netsrc_t sock, int length, void *data, const netadr_t& to)
{
int ret;
struct sockaddr addr;
SOCKET net_socket;
if (to.type == NA_LOOPBACK)
{
NET_SendLoopPacket(sock, length, data, to);
return;
}
SOCKET net_socket;
if (to.type == NA_BROADCAST)
{
net_socket = ip_sockets[sock];
@ -1458,9 +1385,10 @@ void NET_SendPacket(netsrc_t sock, int length, void *data, const netadr_t& to)
Sys_Error("%s: bad address type", __func__);
}
struct sockaddr addr;
NetadrToSockadr(&to, &addr);
ret = NET_SendLong(sock, net_socket, (const char *)data, length, 0, &addr, sizeof(addr));
int ret = NET_SendLong(sock, net_socket, (const char *)data, length, 0, &addr, sizeof(addr));
if (ret == -1)
{
int err = NET_GetLastError();
@ -1499,13 +1427,11 @@ void NET_SendPacket(netsrc_t sock, int length, void *data, const netadr_t& to)
}
}
SOCKET NET_IPSocket(char *net_interface, int port, qboolean multicast)
{
SOCKET newsocket;
struct sockaddr_in address;
qboolean _true = TRUE;
int i = 1;
int err;
#ifdef _WIN32
if ((newsocket = CRehldsPlatformHolder::get()->socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)
@ -1513,7 +1439,7 @@ SOCKET NET_IPSocket(char *net_interface, int port, qboolean multicast)
if ((newsocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)
#endif // _WIN32
{
err = NET_GetLastError();
int err = NET_GetLastError();
if (err != WSAEAFNOSUPPORT)
{
Con_Printf("WARNING: UDP_OpenSocket: port: %d socket: %s", port, NET_ErrorString(err));
@ -1531,6 +1457,7 @@ SOCKET NET_IPSocket(char *net_interface, int port, qboolean multicast)
return INV_SOCK;
}
qboolean i = TRUE;
#ifdef _WIN32
if (CRehldsPlatformHolder::get()->setsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == SOCKET_ERROR)
#else
@ -1557,11 +1484,11 @@ SOCKET NET_IPSocket(char *net_interface, int port, qboolean multicast)
#ifndef _WIN32
if (COM_CheckParm("-tos"))
{
i = 16;
int i = IPTOS_LOWDELAY;
Con_Printf("Enabling LOWDELAY TOS option\n");
if (setsockopt(newsocket, IPPROTO_IP, IP_TOS, (char *)&i, sizeof(i)) == SOCKET_ERROR)
{
err = NET_GetLastError();
int err = NET_GetLastError();
if (err != WSAENOPROTOOPT)
Con_Printf("WARNING: UDP_OpenSocket: port: %d setsockopt IP_TOS: %s\n", port, NET_ErrorString(err));
return INV_SOCK;
@ -1569,12 +1496,14 @@ SOCKET NET_IPSocket(char *net_interface, int port, qboolean multicast)
}
#endif // _WIN32
struct sockaddr_in address;
if (net_interface && *net_interface && Q_stricmp(net_interface, "localhost"))
NET_StringToSockaddr(net_interface, (sockaddr *)&address);
else
address.sin_addr.s_addr = INADDR_ANY;
if (port == -1)
if (port == -1) // TODO: Always false?
address.sin_port = 0;
else
address.sin_port = htons((u_short)port);
@ -1596,19 +1525,19 @@ SOCKET NET_IPSocket(char *net_interface, int port, qboolean multicast)
return INV_SOCK;
}
i = COM_CheckParm("-loopback") != 0;
qboolean bLoopBack = COM_CheckParm("-loopback") != 0;
#ifdef _WIN32
if (CRehldsPlatformHolder::get()->setsockopt(newsocket, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&i, sizeof(i)) == SOCKET_ERROR)
if (CRehldsPlatformHolder::get()->setsockopt(newsocket, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&bLoopBack, sizeof(bLoopBack)) == SOCKET_ERROR)
#else
if (setsockopt(newsocket, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&i, sizeof(i)) == SOCKET_ERROR)
if (setsockopt(newsocket, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&bLoopBack, sizeof(bLoopBack)) == SOCKET_ERROR)
#endif // _WIN32
{
Con_DPrintf("WARNING: UDP_OpenSocket: port %d setsockopt IP_MULTICAST_LOOP: %s\n", port, NET_ErrorString(NET_GetLastError()));
}
#if !defined _WIN32 && defined REHLDS_FIXES
i = IP_PMTUDISC_DONT;
if (setsockopt(newsocket, IPPROTO_IP, IP_MTU_DISCOVER, (char *)&i, sizeof(i)) == SOCKET_ERROR)
int j = IP_PMTUDISC_DONT;
if (setsockopt(newsocket, IPPROTO_IP, IP_MTU_DISCOVER, (char *)&j, sizeof(j)) == SOCKET_ERROR)
{
Con_Printf("WARNING: UDP_OpenSocket: port %d setsockopt IP_MTU_DISCOVER: %s\n", port, NET_ErrorString(NET_GetLastError()));
}
@ -1620,25 +1549,22 @@ SOCKET NET_IPSocket(char *net_interface, int port, qboolean multicast)
void NET_OpenIP()
{
//cvar_t *ip;//unused?
int port;
int dedicated;
int sv_port = 0;
int cl_port = 0;
//int mc_port;//unused?
static qboolean bFirst = TRUE;
dedicated = g_pcls.state == ca_dedicated;
int dedicated = g_pcls.state == ca_dedicated;
NET_ThreadLock();
if (ip_sockets[NS_SERVER] == INV_SOCK)
{
port = (int)iphostport.value;
int port = (int)iphostport.value;
if (!port)
if (!NET_CheckPort(port))
{
port = (int)hostport.value;
if (!port)
if (!NET_CheckPort(port))
{
port = (int)defport.value;
hostport.value = defport.value;
@ -1662,12 +1588,12 @@ void NET_OpenIP()
if (ip_sockets[NS_CLIENT] == INV_SOCK)
{
port = (int)ip_clientport.value;
int port = (int)ip_clientport.value;
if (!port)
if (!NET_CheckPort(port))
{
port = (int)clientport.value;
if (!port)
if (!NET_CheckPort(port))
port = -1;
}
ip_sockets[NS_CLIENT] = NET_IPSocket(ipname.string, port, FALSE);
@ -1685,6 +1611,7 @@ void NET_OpenIP()
NET_ThreadUnlock();
static qboolean bFirst = TRUE;
if (bFirst)
{
bFirst = FALSE;
@ -1699,7 +1626,6 @@ SOCKET NET_IPXSocket(int hostshort)
int err;
u_long optval = 1;
SOCKET newsocket;
SOCKADDR_IPX address;
if((newsocket = CRehldsPlatformHolder::get()->socket(PF_IPX, SOCK_DGRAM, NSPROTO_IPX)) == INVALID_SOCKET)
{
@ -1731,6 +1657,7 @@ SOCKET NET_IPXSocket(int hostshort)
return INV_SOCK;
}
SOCKADDR_IPX address;
address.sa_family = AF_IPX;
Q_memset(address.sa_netnum, 0, 4);
Q_memset(address.sa_nodenum, 0, 6);
@ -1751,20 +1678,17 @@ SOCKET NET_IPXSocket(int hostshort)
void NET_OpenIPX()
{
int port;
int dedicated;
dedicated = g_pcls.state == ca_dedicated;
int dedicated = g_pcls.state == ca_dedicated;
NET_ThreadLock();
if (ipx_sockets[NS_SERVER] == INV_SOCK)
{
port = ipx_hostport.value;
if (!port)
int port = ipx_hostport.value;
if (!NET_CheckPort(port))
{
port = hostport.value;
if (!port)
if (!NET_CheckPort(port))
{
hostport.value = defport.value;
port = defport.value;
@ -1782,11 +1706,11 @@ void NET_OpenIPX()
if (ipx_sockets[NS_CLIENT] == INV_SOCK)
{
port = ipx_clientport.value;
if (!port)
int port = ipx_clientport.value;
if (!NET_CheckPort(port))
{
port = clientport.value;
if (!port)
if (!NET_CheckPort(port))
port = -1;
}
ipx_sockets[NS_CLIENT] = NET_IPXSocket(port);
@ -1898,10 +1822,18 @@ int NET_IsConfigured()
return net_configured;
}
bool NET_CheckPort(int port)
{
#ifdef REHLDS_FIXES
return port > 0 && port <= USHRT_MAX;
#else
return port != 0;
#endif
}
void NET_Config(qboolean multiplayer)
{
static qboolean old_config;
static qboolean bFirst = TRUE;
if (old_config == multiplayer)
{
@ -1918,6 +1850,8 @@ void NET_Config(qboolean multiplayer)
if (!noipx)
NET_OpenIPX();
#endif //_WIN32
static qboolean bFirst = TRUE;
if (bFirst)
{
bFirst = FALSE;
@ -2085,13 +2019,15 @@ void NET_Shutdown()
NET_FlushQueues();
}
qboolean NET_JoinGroup(netsrc_t sock, netadr_t& addr)
NOXREF qboolean NET_JoinGroup(netsrc_t sock, netadr_t& addr)
{
NOXREFCHECK;
ip_mreq mreq;
SOCKET net_socket = ip_sockets[sock];
SIN_SET_ADDR(&mreq.imr_multiaddr, *(unsigned int*)&addr.ip[0]);
SIN_SET_ADDR(&mreq.imr_interface, 0);
SOCKET net_socket = ip_sockets[sock];
if (CRehldsPlatformHolder::get()->setsockopt(net_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) == SOCKET_ERROR)
{
int err = NET_GetLastError();
@ -2105,17 +2041,18 @@ qboolean NET_JoinGroup(netsrc_t sock, netadr_t& addr)
return TRUE;
}
qboolean NET_LeaveGroup(netsrc_t sock, netadr_t& addr)
NOXREF qboolean NET_LeaveGroup(netsrc_t sock, netadr_t& addr)
{
NOXREFCHECK;
ip_mreq mreq;
SOCKET net_socket = ip_sockets[sock];
SIN_SET_ADDR(&mreq.imr_multiaddr, *(unsigned int*)&addr.ip[0]);
SIN_SET_ADDR(&mreq.imr_interface, 0);
if (CRehldsPlatformHolder::get()->setsockopt(net_socket, 0, 6, (char *)&mreq, sizeof(mreq)) != SOCKET_ERROR)
SOCKET net_socket = ip_sockets[sock];
if (CRehldsPlatformHolder::get()->setsockopt(net_socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) != SOCKET_ERROR)
{
int err = NET_GetLastError();
if (err != WSAEAFNOSUPPORT)
if (NET_GetLastError() != WSAEAFNOSUPPORT)
{
return FALSE;
}

View File

@ -207,10 +207,11 @@ SOCKET NET_IPXSocket(int hostshort);
void NET_OpenIPX();
void NET_GetLocalAddress();
int NET_IsConfigured();
bool NET_CheckPort(int port);
void NET_Config(qboolean multiplayer);
void MaxPlayers_f();
void NET_Init();
void NET_ClearLagData(qboolean bClient, qboolean bServer);
void NET_Shutdown();
qboolean NET_JoinGroup(netsrc_t sock, netadr_t& addr);
qboolean NET_LeaveGroup(netsrc_t sock, netadr_t& addr);
NOXREF qboolean NET_JoinGroup(netsrc_t sock, netadr_t& addr);
NOXREF qboolean NET_LeaveGroup(netsrc_t sock, netadr_t& addr);

View File

@ -71,6 +71,7 @@
#include <link.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <sys/mman.h>