30 #if (defined(__GNUC__) || defined(__GCCXML__)) && !defined(__WIN32__)
42 using namespace SLNet;
50 #if USE_SLIDING_WINDOW_CONGESTION_CONTROL!=1
63 #include <arpa/inet.h>
69 #include <netinet/in.h>
71 #include <sys/types.h>
72 #include <sys/socket.h>
73 #include <sys/ioctl.h>
116 #if RAKNET_SUPPORT_IPV6==1
117 void PrepareAddrInfoHints(addrinfo *hints)
119 memset(hints, 0,
sizeof (addrinfo));
120 hints->ai_socktype = SOCK_DGRAM;
121 hints->ai_flags = AI_PASSIVE;
127 #ifdef __native_client__
134 setsockopt__(listenSocket, SOL_SOCKET, SO_RCVBUF, (
char * ) & sock_opt,
sizeof ( sock_opt ) );
140 setsockopt__(listenSocket, SOL_SOCKET, SO_LINGER, (
char * ) & sock_opt,
sizeof ( sock_opt ) );
147 setsockopt__(listenSocket, SOL_SOCKET, SO_SNDBUF, (
char * ) & sock_opt,
sizeof ( sock_opt ) );
150 if (blockingSocket==
false)
153 unsigned long nonblocking = 1;
159 fcntl( listenSocket, F_SETFL, O_NONBLOCK );
167 if (
setsockopt__(listenSocket, SOL_SOCKET, SO_BROADCAST, (
char * ) & sock_opt,
sizeof( sock_opt ) ) == -1 )
169 #if defined(_WIN32) && defined(_DEBUG)
170 #if !defined(WINDOWS_PHONE_8)
171 DWORD dwIOError = GetLastError();
176 LPTSTR messageBuffer;
177 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
178 NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
179 ( LPTSTR ) & messageBuffer, 0, NULL );
181 RAKNET_DEBUG_TPRINTF(
_T(
"setsockopt__(SO_BROADCAST) failed:Error code - %lu\n%s"), dwIOError, messageBuffer );
183 LocalFree( messageBuffer );
204 #if defined(WINDOWS_STORE_RT)
207 #elif defined(_WIN32)
208 INTERFACE_INFO InterfaceList[20];
209 unsigned long nBytesReturned;
210 if (WSAIoctl(inSock, SIO_GET_INTERFACE_LIST, 0, 0, &InterfaceList,
211 sizeof(InterfaceList), &nBytesReturned, 0, 0) == SOCKET_ERROR) {
215 int nNumInterfaces = nBytesReturned /
sizeof(INTERFACE_INFO);
217 for (
int i = 0; i < nNumInterfaces; ++i)
219 sockaddr_in *pAddress;
220 pAddress = (sockaddr_in *) & (InterfaceList[i].iiAddress);
222 inet_ntop(pAddress->sin_family, &pAddress->sin_addr, ip, 65);
225 if (inIpString==ipString)
227 pAddress = (sockaddr_in *) & (InterfaceList[i].iiNetmask);
229 inet_ntop(pAddress->sin_family, &pAddress->sin_addr, netmaskIP, 65);
230 netMaskString=netmaskIP;
231 return netMaskString;
238 fd2 =
socket__(AF_INET, SOCK_DGRAM, 0);
247 ifc.ifc_len =
sizeof(buf);
249 if(ioctl(fd2, SIOCGIFCONF, &ifc) < 0)
257 int intNum = ifc.ifc_len /
sizeof(
struct ifreq);
258 for(
int i = 0; i < intNum; i++)
261 inet_ntop(AF_INET, &((
struct sockaddr_in *)&ifr[i].ifr_addr)->sin_addr, ip, 65);
264 if (inIpString==ipString)
267 fd =
socket__(AF_INET, SOCK_DGRAM, 0);
272 ifr2.ifr_addr.sa_family = AF_INET;
274 strncpy_s(ifr2.ifr_name, IFNAMSIZ, ifr[i].ifr_name, IFNAMSIZ-1);
276 ioctl(fd, SIOCGIFNETMASK, &ifr2);
280 inet_ntop(AF_INET, &((
struct sockaddr_in *)&ifr2.ifr_addr)->sin_addr, ip, 65);
283 return netMaskString;
369 #if defined(WINDOWS_STORE_RT)
381 if ( gethostname( ac,
sizeof( ac ) ) == -1 )
383 #if defined(_WIN32) && !defined(WINDOWS_PHONE_8)
384 DWORD dwIOError = GetLastError();
385 LPTSTR messageBuffer;
386 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
387 NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
388 ( LPTSTR ) & messageBuffer, 0, NULL );
392 LocalFree( messageBuffer );
397 #if RAKNET_SUPPORT_IPV6==1
398 struct addrinfo hints;
399 struct addrinfo *servinfo=0, *aip;
400 PrepareAddrInfoHints(&hints);
401 getaddrinfo(ac,
"", &hints, &servinfo);
405 if (aip->ai_family == AF_INET)
407 struct sockaddr_in *ipv4 = (
struct sockaddr_in *)aip->ai_addr;
408 memcpy(&addresses[idx].address.addr4,ipv4,
sizeof(sockaddr_in));
412 struct sockaddr_in6 *ipv6 = (
struct sockaddr_in6 *)aip->ai_addr;
413 memcpy(&addresses[idx].address.addr4,ipv6,
sizeof(sockaddr_in6));
418 freeaddrinfo(servinfo);
420 struct addrinfo *curAddress = NULL;
421 int err = getaddrinfo(ac, NULL, NULL, &curAddress);
425 #if defined(_WIN32) && !defined(WINDOWS_PHONE_8)
426 int wsaError = WSAGetLastError();
427 LPTSTR messageBuffer;
428 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
429 NULL, wsaError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
430 ( LPTSTR ) & messageBuffer, 0, NULL );
435 LocalFree( messageBuffer );
439 while (curAddress != NULL && idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS)
441 if (curAddress->ai_family == AF_INET) {
442 addresses[idx].address.addr4 = *((
struct sockaddr_in *)curAddress->ai_addr);
445 curAddress = curAddress->ai_next;
448 #endif // else RAKNET_SUPPORT_IPV6==1
450 while (idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS)
468 #if defined(WINDOWS_STORE_RT)
469 GetMyIP_WinRT(addresses);
470 #elif defined(_WIN32)
495 #if defined(__native_client__)
499 memset(&sa,0,
sizeof(sockaddr_in));
500 socklen_t len =
sizeof(sa);
503 #if defined(_WIN32) && defined(_DEBUG) && !defined(WINDOWS_PHONE_8)
504 DWORD dwIOError = GetLastError();
505 LPTSTR messageBuffer;
506 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
507 NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
508 ( LPTSTR ) & messageBuffer, 0, NULL );
513 LocalFree( messageBuffer );
520 systemAddressOut->
address.addr4.sin_addr.s_addr=sa.sin_addr.s_addr;
531 #if RAKNET_SUPPORT_IPV6!=1
540 #if defined(_WIN32) && defined(_DEBUG)
541 DWORD dwIOError = GetLastError();
542 LPVOID messageBuffer;
543 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
544 NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
545 ( LPTSTR ) & messageBuffer, 0, NULL );
547 RAKNET_DEBUG_TPRINTF(
_T(
"getsockname failed:Error code - %d\n%s"), dwIOError, static_cast<LPTSTR>(messageBuffer));
550 LocalFree( messageBuffer );
556 if (ss.ss_family==AF_INET)
558 memcpy(&systemAddressOut->
address.addr4,(sockaddr_in *)&ss,
sizeof(sockaddr_in));
559 systemAddressOut->
debugPort=ntohs(systemAddressOut->
address.addr4.sin_port);
562 if (memcmp(&systemAddressOut->
address.addr4.sin_addr.s_addr, &zero,
sizeof(zero))==0)
568 memcpy(&systemAddressOut->
address.addr6,(sockaddr_in6 *)&ss,
sizeof(sockaddr_in6));
569 systemAddressOut->
debugPort=ntohs(systemAddressOut->
address.addr6.sin6_port);
572 memset(zero,0,
sizeof(zero));
573 if (memcmp(&systemAddressOut->
address.addr4.sin_addr.s_addr, &zero,
sizeof(zero))==0)
578 #endif // #if RAKNET_SUPPORT_IPV6!=1
598 if (ipProto==AF_UNSPEC)
601 ipList[0].
ToString(
false,firstBindable,static_cast<size_t>(128));
611 if (ipList[l].GetIPVersion()==4 && ipProto==AF_INET)
613 if (ipList[l].GetIPVersion()==6 && ipProto==AF_INET6)
625 ipList[l].
ToString(
false,firstBindable,static_cast<size_t>(128));