X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=lhnet.c;h=f2f7b570146296627419cd32aa19cbbb47e81037;hp=ede0e7e2fd1c3032f101a5697680394e157f2e97;hb=3a16e432521bf1f1bb796a76c3819a5334b59b9b;hpb=92abcb36ac02872f8d8e2c88b9523325d6bfd4b5 diff --git a/lhnet.c b/lhnet.c index ede0e7e2..f2f7b570 100644 --- a/lhnet.c +++ b/lhnet.c @@ -8,13 +8,13 @@ #ifdef WIN32 #include #else -#include -#include -//#include #include #include #include #include +#include +#include +#include #endif // for Z_Malloc/Z_Free in quake @@ -32,6 +32,16 @@ #include "lhnet.h" +// to make LHNETADDRESS_FromString resolve repeated hostnames faster, cache them +#define MAX_NAMECACHE 64 +static struct namecache_s +{ + lhnetaddress_t address; + char name[64]; +} +namecache[MAX_NAMECACHE]; +static int namecacheposition = 0; + int LHNETADDRESS_FromPort(lhnetaddress_t *address, int addresstype, int port) { if (!address) @@ -64,7 +74,7 @@ int LHNETADDRESS_FromPort(lhnetaddress_t *address, int addresstype, int port) int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int defaultport) { - int port, namelen, d1, d2, d3, d4; + int i, port, namelen, d1, d2, d3, d4; struct hostent *hostentry; const char *colon; char name[128]; @@ -113,6 +123,24 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def #endif return 1; } + for (i = 0;i < MAX_NAMECACHE;i++) + if (!strcmp(namecache[i].name, name)) + break; + if (i < MAX_NAMECACHE) + { + *address = namecache[i].address; + if (address->addresstype == LHNETADDRESSTYPE_INET6) + { + address->addressdata.inet6.port = htons((unsigned short)port); + return 1; + } + else if (address->addresstype == LHNETADDRESSTYPE_INET4) + { + address->addressdata.inet4.port = htons((unsigned short)port); + return 1; + } + return false; + } // try gethostbyname (handles dns and other ip formats) hostentry = gethostbyname(name); if (hostentry) @@ -124,6 +152,11 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def address->addressdata.inet6.family = hostentry->h_addrtype; address->addressdata.inet6.port = htons((unsigned short)port); memcpy(address->addressdata.inet6.address, hostentry->h_addr_list[0], sizeof(address->addressdata.inet6.address)); + for (i = 0;i < (int)sizeof(namecache[namecacheposition].name)-1 && name[i];i++) + namecache[namecacheposition].name[i] = name[i]; + namecache[namecacheposition].name[i] = 0; + namecache[namecacheposition].address = *address; + namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; #ifdef STANDALONETEST printf("gethostbyname(\"%s\") returned ipv6 address [%x:%x:%x:%x:%x:%x:%x:%x]:%d\n", name, (int)address->addressdata.inet6.address[0], (int)address->addressdata.inet6.address[1], (int)address->addressdata.inet6.address[2], (int)address->addressdata.inet6.address[3], (int)address->addressdata.inet6.address[4], (int)address->addressdata.inet6.address[5], (int)address->addressdata.inet6.address[6], (int)address->addressdata.inet6.address[7], (int)ntohs(address->addressdata.inet6.port)); #endif @@ -136,6 +169,11 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def address->addressdata.inet4.family = hostentry->h_addrtype; address->addressdata.inet4.port = htons((unsigned short)port); memcpy(address->addressdata.inet4.address, hostentry->h_addr_list[0], sizeof(address->addressdata.inet4.address)); + for (i = 0;i < (int)sizeof(namecache[namecacheposition].name)-1 && name[i];i++) + namecache[namecacheposition].name[i] = name[i]; + namecache[namecacheposition].name[i] = 0; + namecache[namecacheposition].address = *address; + namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; #ifdef STANDALONETEST printf("gethostbyname(\"%s\") returned ipv4 address %d.%d.%d.%d:%d\n", name, (int)address->addressdata.inet4.address[0], (int)address->addressdata.inet4.address[1], (int)address->addressdata.inet4.address[2], (int)address->addressdata.inet4.address[3], (int)ntohs(address->addressdata.inet4.port)); #endif @@ -145,6 +183,11 @@ int LHNETADDRESS_FromString(lhnetaddress_t *address, const char *string, int def #ifdef STANDALONETEST printf("gethostbyname failed on address \"%s\"\n", name); #endif + for (i = 0;i < (int)sizeof(namecache[namecacheposition].name)-1 && name[i];i++) + namecache[namecacheposition].name[i] = name[i]; + namecache[namecacheposition].name[i] = 0; + namecache[namecacheposition].address.addresstype = LHNETADDRESSTYPE_NONE; + namecacheposition = (namecacheposition + 1) % MAX_NAMECACHE; return 0; } @@ -347,9 +390,9 @@ static const char *LHNETPRIVATE_StrError(void) int i = WSAGetLastError(); switch (i) { - case WSAEINTR: return "WSAEINTR"; + case WSAEINTR: return "WSAEINTR"; case WSAEBADF: return "WSAEBADF"; - case WSAEACCES: return "WSAEACCES"; + case WSAEACCES: return "WSAEACCES"; case WSAEFAULT: return "WSAEFAULT"; case WSAEINVAL: return "WSAEINVAL"; case WSAEMFILE: return "WSAEMFILE"; @@ -392,7 +435,7 @@ static const char *LHNETPRIVATE_StrError(void) case WSAEREMOTE: return "WSAEREMOTE"; case WSAEDISCON: return "WSAEDISCON"; case 0: return "no error"; - default: return "unknown WSAE error"; + default: return "unknown WSAE error"; } #else return strerror(errno); @@ -467,7 +510,10 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) namelen = address->addresstype == LHNETADDRESSTYPE_INET6 ? sizeof(lhnetsocket->address.addressdata.inet6) : sizeof(lhnetsocket->address.addressdata.inet4); if (bind(lhnetsocket->inetsocket, (void *)&lhnetsocket->address.addressdata, namelen) != -1) { + int i = 1; getsockname(lhnetsocket->inetsocket, (void *)&lhnetsocket->address.addressdata, &namelen); + // enable broadcast on this socket + setsockopt(lhnetsocket->inetsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)); lhnetsocket->next = &lhnet_socketlist; lhnetsocket->prev = lhnetsocket->next->prev; lhnetsocket->next->prev = lhnetsocket; @@ -565,7 +611,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, continue; } #ifndef STANDALONETEST - if (p->sentdoubletime && Sys_DoubleTime() < p->sentdoubletime) + if (cl_netlocalping.value && (Sys_DoubleTime() - cl_netlocalping.value * (1.0 / 2000.0)) < p->sentdoubletime) continue; #endif if (value == 0 && p->destinationport == lhnetsocket->address.addressdata.loop.port) @@ -681,8 +727,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng p->next->prev = p; p->prev->next = p; #ifndef STANDALONETEST - if (cl_netlocalping_min.value || cl_netlocalping_max.value) - p->sentdoubletime = Sys_DoubleTime() + lhrandom(cl_netlocalping_min.value, cl_netlocalping_max.value) * (0.5 / 1000.0); + p->sentdoubletime = Sys_DoubleTime(); #endif value = contentlength; }