X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=lhnet.c;h=fc1acf2b056724cc983cc8bbbb4be46bd332fd1c;hb=fa561c1a0e1f754cab309168853a0e3b253081c8;hp=2ba0fcfe743ef2513754790e657d283012725395;hpb=861c406b589acf1252ddc231e02f94557a15e2bc;p=xonotic%2Fdarkplaces.git diff --git a/lhnet.c b/lhnet.c index 2ba0fcfe..fc1acf2b 100644 --- a/lhnet.c +++ b/lhnet.c @@ -2,7 +2,9 @@ // Written by Forest Hale 2003-06-15 and placed into public domain. #ifdef WIN32 +#ifdef _MSC_VER #pragma comment(lib, "ws2_32.lib") +#endif # ifdef SUPPORTIPV6 // Windows XP or higher is required for getaddrinfo, but the inclusion of wspiapi provides fallbacks for older versions # define _WIN32_WINNT 0x0501 @@ -152,7 +154,7 @@ int LHNETADDRESS_FromPort(lhnetaddress_t *vaddress, lhnetaddresstype_t addressty } #ifdef SUPPORTIPV6 -int LHNETADDRESS_Resolve(lhnetaddressnative_t *address, const char *name, int port) +static int LHNETADDRESS_Resolve(lhnetaddressnative_t *address, const char *name, int port) { char port_buff [16]; struct addrinfo hints; @@ -387,8 +389,12 @@ int LHNETADDRESS_FromString(lhnetaddress_t *vaddress, const char *string, int de address->addresstype = LHNETADDRESSTYPE_NONE; port = 0; colon = strrchr(string, ':'); - if (colon) + if (colon && (colon == strchr(string, ':') || (string[0] == '[' && colon - string > 0 && colon[-1] == ']'))) + // EITHER: colon is the ONLY colon OR: colon comes after [...] delimited IPv6 address + // fixes misparsing of IPv6 addresses without port + { port = atoi(colon + 1); + } else colon = string + strlen(string); if (port == 0) @@ -606,7 +612,7 @@ int LHNETADDRESS_GetAddressType(const lhnetaddress_t *address) return LHNETADDRESSTYPE_NONE; } -const char *LHNETADDRESS_GetInterfaceName(const lhnetaddress_t *vaddress) +const char *LHNETADDRESS_GetInterfaceName(const lhnetaddress_t *vaddress, char *ifname, size_t ifnamelength) { #ifdef SUPPORTIPV6 lhnetaddressnative_t *address = (lhnetaddressnative_t *)vaddress; @@ -615,8 +621,6 @@ const char *LHNETADDRESS_GetInterfaceName(const lhnetaddress_t *vaddress) { #ifndef _WIN32 - static char ifname [IF_NAMESIZE]; - if (if_indextoname(address->addr.in6.sin6_scope_id, ifname) == ifname) return ifname; @@ -625,9 +629,7 @@ const char *LHNETADDRESS_GetInterfaceName(const lhnetaddress_t *vaddress) // The Win32 API doesn't have if_indextoname() until Windows Vista, // but luckily it just uses the interface ID as the interface name - static char ifname [16]; - - if (dpsnprintf(ifname, sizeof(ifname), "%lu", address->addr.in6.sin6_scope_id) > 0) + if (dpsnprintf(ifname, ifnamelength, "%lu", address->addr.in6.sin6_scope_id) > 0) return ifname; #endif @@ -837,7 +839,11 @@ void LHNET_SleepUntilPacket_Microseconds(int microseconds) { if (lastfd < s->inetsocket) lastfd = s->inetsocket; +#if defined(WIN32) && !defined(_MSC_VER) + FD_SET((int)s->inetsocket, &fdreadset); +#else FD_SET((unsigned int)s->inetsocket, &fdreadset); +#endif } } tv.tv_sec = microseconds / 1000000; @@ -939,6 +945,20 @@ lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address) lhnetaddressnative_t *localaddress = (lhnetaddressnative_t *)&lhnetsocket->address; SOCKLEN_T namelen; int bindresult; + +#if defined(SOL_RFC1149) && defined(RFC1149_1149ONLY) + // we got reports of massive lags when this protocol was chosen as transport + // so better turn it off + { + int rfc1149only = 0; + int rfc1149enabled = 0; + if(setsockopt(lhnetsocket->inetsocket, SOL_RFC1149, RFC1149_1149ONLY, &rfc1149only)) + Con_Printf("LHNET_OpenSocket_Connectionless: warning: setsockopt(RFC1149_1149ONLY) returned error: %s\n", LHNETPRIVATE_StrError()); + if(setsockopt(lhnetsocket->inetsocket, SOL_RFC1149, RFC1149_ENABLED, &rfc1149enabled)) + Con_Printf("LHNET_OpenSocket_Connectionless: warning: setsockopt(RFC1149_ENABLED) returned error: %s\n", LHNETPRIVATE_StrError()); + } +#endif + #ifdef SUPPORTIPV6 if (address->addresstype == LHNETADDRESSTYPE_INET6) { @@ -1097,7 +1117,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, Con_Print("Connection refused\n"); return 0; } - Con_Printf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError()); + Con_DPrintf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError()); } } #ifdef SUPPORTIPV6 @@ -1106,7 +1126,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, SOCKLEN_T inetaddresslength; address->addresstype = LHNETADDRESSTYPE_NONE; inetaddresslength = sizeof(address->addr.in6); - value = recvfrom(lhnetsocket->inetsocket, (char *)content, maxcontentlength, 0, &address->addr.sock, &inetaddresslength); + value = recvfrom(lhnetsocket->inetsocket, (char *)content, maxcontentlength, LHNET_RECVFROM_FLAGS, &address->addr.sock, &inetaddresslength); if (value > 0) { address->addresstype = LHNETADDRESSTYPE_INET6; @@ -1124,7 +1144,7 @@ int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, Con_Print("Connection refused\n"); return 0; } - Con_Printf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError()); + Con_DPrintf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError()); } } #endif @@ -1165,7 +1185,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng { if (SOCKETERRNO == EWOULDBLOCK) return 0; - Con_Printf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError()); + Con_DPrintf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError()); } } #ifdef SUPPORTIPV6 @@ -1176,7 +1196,7 @@ int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentleng { if (SOCKETERRNO == EWOULDBLOCK) return 0; - Con_Printf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError()); + Con_DPrintf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError()); } } #endif