X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=lhnet.c;h=2546ff3b83fffa9ff4808e1a96fb71c417b67838;hp=5beafc77a41c6a2ea5a1d759e7353f7e2b9cd680;hb=8ebb89488cfbf28c6d0234dbb6fec83c59e29e1e;hpb=ba5b126f297cae174828ed124f7c5ad9a69aba4e diff --git a/lhnet.c b/lhnet.c index 5beafc77..2546ff3b 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 @@ -104,7 +111,7 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def struct hostent *hostentry; const char *colon; char name[128]; - if (!address || !string) + if (!address || !string || !*string) return 0; memset(address, 0, sizeof(*address)); address->addresstype = LHNETADDRESSTYPE_NONE; @@ -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((unsigned int)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; @@ -769,7 +805,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng int main(int argc, char **argv) { #if 1 - char *buffer = "socket to socket test successful", buffer2[1024]; + char *buffer = "test", buffer2[1024]; int blen = strlen(buffer); int b2len = 1024; lhnetsocket_t *sock1; @@ -777,24 +813,26 @@ int main(int argc, char **argv) lhnetaddress_t myaddy1; lhnetaddress_t myaddy2; lhnetaddress_t myaddy3; + lhnetaddress_t localhostaddy1; + lhnetaddress_t localhostaddy2; int test1; int test2; - strcpy(buffer2, "socket to socket test failed"); - printf("calling LHNET_Init\n"); LHNET_Init(); printf("calling LHNET_FromPort twice to create two local addresses\n"); LHNETADDRESS_FromPort(&myaddy1, LHNETADDRESSTYPE_INET4, 4000); LHNETADDRESS_FromPort(&myaddy2, LHNETADDRESSTYPE_INET4, 4001); + LHNETADDRESS_FromString(&localhostaddy1, "127.0.0.1", 4000); + LHNETADDRESS_FromString(&localhostaddy2, "127.0.0.1", 4001); printf("calling LHNET_OpenSocket_Connectionless twice to create two local sockets\n"); sock1 = LHNET_OpenSocket_Connectionless(&myaddy1); sock2 = LHNET_OpenSocket_Connectionless(&myaddy2); printf("calling LHNET_Write to send a packet from the first socket to the second socket\n"); - test1 = LHNET_Write(sock1, buffer, blen, &myaddy2); + test1 = LHNET_Write(sock1, buffer, blen, &localhostaddy2); printf("sleeping briefly\n"); #ifdef WIN32 Sleep (100); @@ -802,8 +840,12 @@ int main(int argc, char **argv) usleep (100000); #endif printf("calling LHNET_Read on the second socket to read the packet sent from the first socket\n"); - test2 = LHNET_Read(sock2, buffer2, b2len, &myaddy3); - Con_Printf("%s\n", buffer2); + test2 = LHNET_Read(sock2, buffer2, b2len - 1, &myaddy3); + if (test2 > 0) + Con_Printf("socket to socket test succeeded\n"); + else + Con_Printf("socket to socket test failed\n"); + #ifdef WIN32 printf("press any key to exit\n"); getchar();