// Written by Forest Hale 2003-06-15 and placed into public domain.
-#ifdef SUPPORTIPV6
#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
+# endif
# include <winsock2.h>
# include <ws2tcpip.h>
# ifdef USE_WSPIAPI_H
# include <wspiapi.h>
# endif
#endif
-#endif
#ifndef STANDALONETEST
#include "quakedef.h"
#include <stdio.h>
#include <time.h>
#include <string.h>
-#ifdef WIN32
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
+#ifndef WIN32
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
switch(addresstype)
{
default:
- return 0;
+ break;
case LHNETADDRESSTYPE_LOOP:
// local:port (loopback)
memset(address, 0, sizeof(*address));
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)
{
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;
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
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;
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
{
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
{
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