break;
case 2:
- if (Q_strcasecmp(Cmd_Argv(1), "off") == 0)
+ if (strcasecmp(Cmd_Argv(1), "off") == 0)
banAddr = 0x00000000;
else
banAddr = inet_addr(Cmd_Argv(1));
if (length == 0)
break;
- if (length == -1)
+ if ((int)length == -1)
{
Con_Printf("Read error\n");
return -1;
if (sfunc.AddrCompare(&readaddr, &sock->addr) != 0)
{
-#ifdef DEBUG
Con_DPrintf("Forged packet received\n");
Con_DPrintf("Expected: %s\n", StrAddr (&sock->addr));
Con_DPrintf("Received: %s\n", StrAddr (&readaddr));
-#endif
continue;
}
else
{
for (s = net_activeSockets; s; s = s->next)
- if (Q_strcasecmp(Cmd_Argv(1), s->address) == 0)
+ if (strcasecmp(Cmd_Argv(1), s->address) == 0)
break;
if (s == NULL)
return;
while (1)
{
len = dfunc.Read (testSocket, net_message.data, net_message.maxsize, &clientaddr);
- if (len < sizeof(int))
+ if (len < (int)sizeof(int))
break;
net_message.cursize = len;
MSG_ReadLong();
if (control == -1)
break;
- if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL)
+ if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
break;
if ((control & NETFLAG_LENGTH_MASK) != len)
break;
if (host && hostCacheCount)
{
for (n = 0; n < hostCacheCount; n++)
- if (Q_strcasecmp (host, hostcache[n].name) == 0)
+ if (strcasecmp (host, hostcache[n].name) == 0)
{
if (hostcache[n].driver != myDriverLevel)
continue;
name[0] = 0;
len = dfunc.Read (test2Socket, net_message.data, net_message.maxsize, &clientaddr);
- if (len < sizeof(int))
+ if (len < (int)sizeof(int))
goto Reschedule;
net_message.cursize = len;
MSG_ReadLong();
if (control == -1)
goto Error;
- if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL)
+ if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
goto Error;
if ((control & NETFLAG_LENGTH_MASK) != len)
goto Error;
if (host && hostCacheCount)
{
for (n = 0; n < hostCacheCount; n++)
- if (Q_strcasecmp (host, hostcache[n].name) == 0)
+ if (strcasecmp (host, hostcache[n].name) == 0)
{
if (hostcache[n].driver != myDriverLevel)
continue;
SZ_Clear(&net_message);
len = dfunc.Read (acceptsock, net_message.data, net_message.maxsize, &clientaddr);
- if (len < sizeof(int))
+ if (len < (int)sizeof(int))
return NULL;
net_message.cursize = len;
MSG_BeginReading ();
control = BigLong(*((int *)net_message.data));
MSG_ReadLong();
-
+
// Messages starting by 0xFFFFFFFF are master server messages
- if (control == 0xFFFFFFFF)
+ if ((unsigned int)control == 0xFFFFFFFF)
{
int responsesize = Master_HandleMessage();
if (responsesize > 0)
}
return NULL;
}
- if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL)
+ if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
return NULL;
if ((control & NETFLAG_LENGTH_MASK) != len)
return NULL;
MSG_WriteByte(&net_message, playerNumber);
MSG_WriteString(&net_message, client->name);
MSG_WriteLong(&net_message, client->colors);
- MSG_WriteLong(&net_message, (int)client->edict->v.frags);
+ MSG_WriteLong(&net_message, (int)client->edict->v->frags);
MSG_WriteLong(&net_message, (int)(net_time - client->netconnection->connecttime));
MSG_WriteString(&net_message, client->netconnection->address);
*((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
ret = dfunc.AddrCompare(&clientaddr, &s->addr);
if (ret >= 0)
{
- // is this a duplicate connection reqeust?
+ // is this a duplicate connection request?
if (ret == 0 && net_time - s->connecttime < 2.0)
{
// yes, so send a duplicate reply
dfunc.GetSocketAddr(s->socket, &newaddr);
MSG_WriteLong(&net_message, dfunc.GetSocketPort(&newaddr));
*((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
+ // LordHavoc: send from s->socket instead of acceptsock, this
+ // way routers usually identify the connection correctly
+ // (thanks to faded for provoking me to recite a lengthy
+ // explanation of NAT nightmares, and realize this easy
+ // workaround for quake)
+ dfunc.Write (s->socket, net_message.data, net_message.cursize, &clientaddr);
+ // LordHavoc: also send from acceptsock, for good measure
dfunc.Write (acceptsock, net_message.data, net_message.cursize, &clientaddr);
SZ_Clear(&net_message);
return NULL;
dfunc.GetSocketAddr(newsock, &newaddr);
MSG_WriteLong(&net_message, dfunc.GetSocketPort(&newaddr));
*((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
+ // LordHavoc: send from sock->socket instead of acceptsock, this way routers
+ // usually identify the connection correctly (thanks to faded for provoking
+ // me to recite a lengthy explanation of NAT nightmares, and realize this
+ // easy workaround for quake)
+ dfunc.Write (sock->socket, net_message.data, net_message.cursize, &clientaddr);
+ // LordHavoc: also send from acceptsock, for good measure
dfunc.Write (acceptsock, net_message.data, net_message.cursize, &clientaddr);
SZ_Clear(&net_message);
static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr)
{
- struct qsockaddr myaddr;
+ //struct qsockaddr myaddr;
int control;
int c, n, i;
- if (net_message.cursize < sizeof(int))
+ if (net_message.cursize < (int)sizeof(int))
return false;
// don't answer our own query
- dfunc.GetSocketAddr (dfunc.controlSock, &myaddr);
+ //dfunc.GetSocketAddr (dfunc.controlSock, &myaddr);
//if (dfunc.AddrCompare(readaddr, &myaddr) >= 0)
// return false;
MSG_ReadLong();
if (control == -1)
return false;
- if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL)
+ if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
return false;
if ((control & NETFLAG_LENGTH_MASK) != net_message.cursize)
return false;
{
if (i == n)
continue;
- if (Q_strcasecmp (hostcache[n].name, hostcache[i].name) == 0)
+ if (strcasecmp (hostcache[n].name, hostcache[i].name) == 0)
{
i = strlen(hostcache[n].name);
if (i < 15 && hostcache[n].name[i-1] > '8')
portnum = atoi (port + 1);
if (!portnum)
portnum = MASTER_PORT;
- Con_DPrintf("Datagram_SearchForInetHosts: sending %d byte message to master %s\n", net_message.cursize, master);
+ Con_DPrintf("Datagram_SearchForInetHosts: sending %d byte message to master %s port %i\n", net_message.cursize, master, portnum);
dfunc.SetSocketPort (&masteraddr, portnum);
- dfunc.Send (net_message.data, net_message.cursize, &masteraddr);
+ dfunc.Write (dfunc.controlSock, net_message.data, net_message.cursize, &masteraddr);
}
}
- while ((ret = dfunc.Recv (net_message.data, net_message.maxsize, &readaddr)) > 0)
- {
- net_message.cursize = ret;
- Con_DPrintf("Datagram_SearchForInetHosts: Recv received %d byte message\n", net_message.cursize);
- Master_ParseServerList (&dfunc);
- }
-
while ((ret = dfunc.Read (dfunc.controlSock, net_message.data, net_message.maxsize, &readaddr)) > 0)
{
net_message.cursize = ret;
Con_DPrintf("Datagram_SearchForInetHosts: Read received %d byte message\n", net_message.cursize);
if (Datagram_HandleServerInfo (&readaddr))
result = true;
+ else
+ Master_ParseServerList (&dfunc);
}
return result;
if (_Datagram_SearchForInetHosts (master))
result = true;
}
-
+
return result;
}
{
struct qsockaddr sendaddr;
struct qsockaddr readaddr;
+ struct qsockaddr testaddr;
qsocket_t *sock;
int newsock;
int ret;
if (ret > 0)
{
// is it from the right place?
- if (sfunc.AddrCompare(&readaddr, &sendaddr) != 0)
+ // we don't care if the port matches (this adds support for
+ // the NAT fix in the server inspired by faded)
+ memcpy(&testaddr, &sendaddr, sizeof(struct qsockaddr));
+ dfunc.SetSocketPort (&testaddr, dfunc.GetSocketPort(&readaddr));
+ if (sfunc.AddrCompare(&readaddr, &testaddr) != 0)
{
- Con_DPrintf("wrong reply address\n");
- Con_DPrintf("Expected: %s\n", StrAddr (&sendaddr));
- Con_DPrintf("Received: %s\n", StrAddr (&readaddr));
+ Con_Printf("wrong reply address\n");
+ Con_Printf("Expected: %s\n", StrAddr (&sendaddr));
+ Con_Printf("Received: %s\n", StrAddr (&readaddr));
+ CL_UpdateScreen ();
CL_UpdateScreen ();
ret = 0;
continue;
}
- if (ret < sizeof(int))
+ if (ret < (int)sizeof(int))
{
ret = 0;
continue;
ret = 0;
continue;
}
- if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL)
+ if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL)
{
ret = 0;
continue;
portnum = MASTER_PORT;
dfunc.SetSocketPort (&masteraddr, portnum);
+ // FIXME: this is the only use of UDP_Send in the entire engine, add a dfunc.acceptSock to get rid of this function!
dfunc.Send (net_message.data, net_message.cursize, &masteraddr);
}