X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=net_dgrm.c;h=b3f7fae2c4d67a41bc63a311506051ef0e4ab17a;hb=038ff8d79bb5044145cc2f87a8df1ce732209e4d;hp=cf72d84dbd0ffd8907ae2398127894cfd125eae9;hpb=419da77f8ab1e6c5dff4479ca5b3fd183944dad3;p=xonotic%2Fdarkplaces.git diff --git a/net_dgrm.c b/net_dgrm.c index cf72d84d..b3f7fae2 100644 --- a/net_dgrm.c +++ b/net_dgrm.c @@ -136,7 +136,7 @@ void NET_Ban_f (void) 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)); @@ -338,11 +338,9 @@ int Datagram_GetMessage (qsocket_t *sock) 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; } @@ -491,7 +489,7 @@ void NET_Stats_f (void) 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; @@ -581,7 +579,7 @@ static void Test_f (void) 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; @@ -711,7 +709,7 @@ static void Test2_f (void) 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; @@ -1004,7 +1002,7 @@ static qsocket_t *_Datagram_CheckNewConnections (void) 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 @@ -1015,6 +1013,13 @@ static qsocket_t *_Datagram_CheckNewConnections (void) 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; @@ -1072,6 +1077,12 @@ static qsocket_t *_Datagram_CheckNewConnections (void) 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); @@ -1092,7 +1103,7 @@ qsocket_t *Datagram_CheckNewConnections (void) static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr) { - struct qsockaddr myaddr; + //struct qsockaddr myaddr; int control; int c, n, i; @@ -1100,7 +1111,7 @@ static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr) 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; @@ -1156,7 +1167,7 @@ static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr) { 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') @@ -1230,23 +1241,18 @@ static qboolean _Datagram_SearchForInetHosts (const char *master) portnum = MASTER_PORT; 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; @@ -1273,6 +1279,7 @@ static qsocket_t *_Datagram_Connect (const char *host) { struct qsockaddr sendaddr; struct qsockaddr readaddr; + struct qsockaddr testaddr; qsocket_t *sock; int newsock; int ret; @@ -1321,11 +1328,16 @@ static qsocket_t *_Datagram_Connect (const char *host) 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; @@ -1462,6 +1474,7 @@ static void _Datagram_Heartbeat (const char *master) 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); }