X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=lhnet.c;h=d72589d1da946794cd7f9d1e6eae691592f8520b;hb=d1a66b1504773e5da10463fd15d524697b0c2ba2;hp=67ccc9a727ac927746b6f0f88ebcbd8462327da3;hpb=a5780130e8bb9cbc054e63840ef94e6e5d21b3b1;p=xonotic%2Fdarkplaces.git diff --git a/lhnet.c b/lhnet.c index 67ccc9a7..d72589d1 100644 --- a/lhnet.c +++ b/lhnet.c @@ -1,6 +1,10 @@ // Written by Forest Hale 2003-06-15 and placed into public domain. +#ifndef STANDALONETEST +#include "quakedef.h" +#endif + #include #include #include @@ -23,7 +27,6 @@ // for Z_Malloc/Z_Free in quake #ifndef STANDALONETEST -#include "quakedef.h" #include "zone.h" #include "sys.h" #include "netconn.h" @@ -42,6 +45,10 @@ #define SOCKETERRNO WSAGetLastError() +#define IOC_VENDOR 0x18000000 +#define _WSAIOW(x,y) (IOC_IN|(x)|(y)) +#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12) + #define SOCKLEN_T int #elif defined(__MORPHOS__) #define ioctlsocket IoctlSocket @@ -134,7 +141,9 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def return 1; } // try to parse as dotted decimal ipv4 address first - if (sscanf(name, "%d.%d.%d.%d", &d1, &d2, &d3, &d4) == 4 && (unsigned int)d1 < 256 && (unsigned int)d2 < 256 && (unsigned int)d3 < 256 && (unsigned int)d4 < 256) + // note this supports partial ip addresses + d1 = d2 = d3 = d4 = 0; + if (sscanf(name, "%d.%d.%d.%d", &d1, &d2, &d3, &d4) >= 1 && (unsigned int)d1 < 256 && (unsigned int)d2 < 256 && (unsigned int)d3 < 256 && (unsigned int)d4 < 256) { // parsed a valid ipv4 address address->addresstype = LHNETADDRESSTYPE_INET4; @@ -155,7 +164,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def #ifdef STANDALONETEST if (i < MAX_NAMECACHE) #else - if (i < MAX_NAMECACHE && Sys_DoubleTime() < namecache[i].expirationtime) + if (i < MAX_NAMECACHE && realtime < namecache[i].expirationtime) #endif { *address = namecache[i].address; @@ -186,7 +195,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def namecache[namecacheposition].name[i] = name[i]; namecache[namecacheposition].name[i] = 0; #ifndef STANDALONETEST - namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours + namecache[namecacheposition].expirationtime = realtime + 12 * 3600; // 12 hours #endif namecache[namecacheposition].address = *address; namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; @@ -206,7 +215,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def namecache[namecacheposition].name[i] = name[i]; namecache[namecacheposition].name[i] = 0; #ifndef STANDALONETEST - namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours + namecache[namecacheposition].expirationtime = realtime + 12 * 3600; // 12 hours #endif namecache[namecacheposition].address = *address; namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; @@ -223,7 +232,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def namecache[namecacheposition].name[i] = name[i]; namecache[namecacheposition].name[i] = 0; #ifndef STANDALONETEST - namecache[namecacheposition].expirationtime = Sys_DoubleTime() + 12 * 3600; // 12 hours + namecache[namecacheposition].expirationtime = realtime + 12 * 3600; // 12 hours #endif namecache[namecacheposition].address.addresstype = LHNETADDRESSTYPE_NONE; namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; @@ -252,7 +261,7 @@ int LHNETADDRESS_ToString(const lhnetaddress_t *address, char *string, int strin { if (stringbuffersize >= 6) { - strcpy(string, "local"); + memcpy(string, "local", 6); return 1; } } @@ -493,6 +502,28 @@ static const char *LHNETPRIVATE_StrError(void) #endif } +void LHNET_SleepUntilPacket_Microseconds(int microseconds) +{ + fd_set fdreadset; + struct timeval tv; + int lastfd; + lhnetsocket_t *s; + FD_ZERO(&fdreadset); + lastfd = 0; + for (s = lhnet_socketlist.next;s != &lhnet_socketlist;s = s->next) + { + if (s->address.addresstype == LHNETADDRESSTYPE_INET4 || s->address.addresstype == LHNETADDRESSTYPE_INET6) + { + if (lastfd < s->inetsocket) + lastfd = s->inetsocket; + FD_SET(s->inetsocket, &fdreadset); + } + } + tv.tv_sec = microseconds / 1000000; + tv.tv_usec = microseconds % 1000000; + select(lastfd + 1, &fdreadset, NULL, NULL, &tv); +} + lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) { lhnetsocket_t *lhnetsocket, *s; @@ -547,6 +578,7 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) { #ifdef WIN32 u_long _true = 1; + u_long _false = 0; #else char _true = 1; #endif @@ -564,6 +596,10 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) lhnetsocket->prev = lhnetsocket->next->prev; lhnetsocket->next->prev = lhnetsocket; lhnetsocket->prev->next = lhnetsocket; +#ifdef WIN32 + if (ioctlsocket(lhnetsocket->inetsocket, SIO_UDP_CONNRESET, &_false) == -1) + Con_DPrintf("LHNET_OpenSocket_Connectionless: ioctlsocket SIO_UDP_CONNRESET returned error: %s\n", LHNETPRIVATE_StrError()); +#endif return lhnetsocket; } else @@ -642,7 +678,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, continue; } #ifndef STANDALONETEST - if (cl_netlocalping.value && (Sys_DoubleTime() - cl_netlocalping.value * (1.0 / 2000.0)) < p->sentdoubletime) + if (cl_netlocalping.value && (realtime - cl_netlocalping.value * (1.0 / 2000.0)) < p->sentdoubletime) continue; #endif if (value == 0 && p->destinationport == lhnetsocket->address.addressdata.loop.port) @@ -738,7 +774,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng p->next->prev = p; p->prev->next = p; #ifndef STANDALONETEST - p->sentdoubletime = Sys_DoubleTime(); + p->sentdoubletime = realtime; #endif value = contentlength; } @@ -749,7 +785,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng { if (SOCKETERRNO == EWOULDBLOCK) return 0; - Con_Printf("LHNET_Read: sendto returned error: %s\n", LHNETPRIVATE_StrError()); + Con_Printf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError()); } } else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6) @@ -759,7 +795,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng { if (SOCKETERRNO == EWOULDBLOCK) return 0; - Con_Printf("LHNET_Read: sendto returned error: %s\n", LHNETPRIVATE_StrError()); + Con_Printf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError()); } } return value;