| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /*
- * Copyright (c) 2014, Oculus VR, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- */
- #include "EmptyHeader.h"
- #ifdef RAKNET_SOCKET_2_INLINE_FUNCTIONS
- #ifndef RAKNETSOCKET2_WINDOWS_LINUX_CPP
- #define RAKNETSOCKET2_WINDOWS_LINUX_CPP
- #if !defined(WINDOWS_STORE_RT) && !defined(__native_client__)
- #if RAKNET_SUPPORT_IPV6==1
- void PrepareAddrInfoHints2(addrinfo *hints)
- {
- memset(hints, 0, sizeof (addrinfo)); // make sure the struct is empty
- hints->ai_socktype = SOCK_DGRAM; // UDP sockets
- hints->ai_flags = AI_PASSIVE; // fill in my IP for me
- }
- void GetMyIP_Windows_Linux_IPV4And6( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] )
- {
- int idx=0;
- char ac[ 80 ];
- int err = gethostname( ac, sizeof( ac ) );
- RakAssert(err != -1);
-
- struct addrinfo hints;
- struct addrinfo *servinfo=0, *aip; // will point to the results
- PrepareAddrInfoHints2(&hints);
- getaddrinfo(ac, "", &hints, &servinfo);
- for (idx=0, aip = servinfo; aip != NULL && idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS; aip = aip->ai_next, idx++)
- {
- if (aip->ai_family == AF_INET)
- {
- struct sockaddr_in *ipv4 = (struct sockaddr_in *)aip->ai_addr;
- memcpy(&addresses[idx].address.addr4,ipv4,sizeof(sockaddr_in));
- }
- else
- {
- struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)aip->ai_addr;
- memcpy(&addresses[idx].address.addr4,ipv6,sizeof(sockaddr_in6));
- }
- }
- freeaddrinfo(servinfo); // free the linked-list
-
- while (idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS)
- {
- addresses[idx]=UNASSIGNED_SYSTEM_ADDRESS;
- idx++;
- }
- }
- #else
- #if (defined(__GNUC__) || defined(__GCCXML__)) && !defined(__WIN32__)
- #include <netdb.h>
- #endif
- void GetMyIP_Windows_Linux_IPV4( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] )
- {
- int idx=0;
- char ac[ 80 ];
- int err = gethostname( ac, sizeof( ac ) );
- (void) err;
- RakAssert(err != -1);
-
- struct hostent *phe = gethostbyname( ac );
- if ( phe == 0 )
- {
- RakAssert(phe!=0);
- return ;
- }
- for ( idx = 0; idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS; ++idx )
- {
- if (phe->h_addr_list[ idx ] == 0)
- break;
- memcpy(&addresses[idx].address.addr4.sin_addr,phe->h_addr_list[ idx ],sizeof(struct in_addr));
- }
-
- while (idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS)
- {
- addresses[idx]=UNASSIGNED_SYSTEM_ADDRESS;
- idx++;
- }
- }
- #endif // RAKNET_SUPPORT_IPV6==1
- void GetMyIP_Windows_Linux( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] )
- {
- #if RAKNET_SUPPORT_IPV6==1
- GetMyIP_Windows_Linux_IPV4And6(addresses);
- #else
- GetMyIP_Windows_Linux_IPV4(addresses);
- #endif
- }
- #endif // Windows and Linux
- #endif // file header
- #endif // #ifdef RAKNET_SOCKET_2_INLINE_FUNCTIONS
|