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));