ESocketErrors FSocketSubsystemBSDIPv6::GetHostByName(const ANSICHAR* HostName, FInternetAddr& OutAddr) { FScopeLock ScopeLock(&HostByNameSynch); addrinfo* AddrInfo = NULL; // We are only interested in IPv6 addresses. addrinfo HintAddrInfo; FMemory::Memzero(&HintAddrInfo, sizeof(HintAddrInfo)); HintAddrInfo.ai_family = AF_INET6; int32 ErrorCode = getaddrinfo(HostName, NULL, &HintAddrInfo, &AddrInfo); ESocketErrors SocketError = TranslateGAIErrorCode(ErrorCode); if (SocketError == SE_NO_ERROR) { for (; AddrInfo != nullptr; AddrInfo = AddrInfo->ai_next) { if (AddrInfo->ai_family == AF_INET6) { sockaddr_in6* IPv6SockAddr = reinterpret_cast<sockaddr_in6*>(AddrInfo->ai_addr); if (IPv6SockAddr != nullptr) { static_cast<FInternetAddrBSDIPv6&>(OutAddr).SetIp(IPv6SockAddr->sin6_addr); return SE_NO_ERROR; } } } return SE_HOST_NOT_FOUND; } return SocketError; }
ESocketErrors FSocketSubsystemBSD::GetHostByName(const ANSICHAR* HostName, FInternetAddr& OutAddr) { #if PLATFORM_HAS_BSD_SOCKET_FEATURE_GETHOSTNAME FScopeLock ScopeLock(&HostByNameSynch); addrinfo* AddrInfo = nullptr; // Limit the IP Addresses we get back to just IPv4 addrinfo HintAddrInfo; FMemory::Memzero(&HintAddrInfo, sizeof(HintAddrInfo)); HintAddrInfo.ai_family = AF_INET; int32 ErrorCode = getaddrinfo(HostName, nullptr, &HintAddrInfo, &AddrInfo); ESocketErrors SocketError = TranslateGAIErrorCode(ErrorCode); if (SocketError == SE_NO_ERROR) { for (; AddrInfo != nullptr; AddrInfo = AddrInfo->ai_next) { if (AddrInfo->ai_family == AF_INET) { sockaddr_in* IPv4SockAddr = reinterpret_cast<sockaddr_in*>(AddrInfo->ai_addr); if (IPv4SockAddr != nullptr) { uint32 HostIP = ntohl(IPv4SockAddr->sin_addr.s_addr); static_cast<FInternetAddrBSD&>(OutAddr).SetIp(HostIP); return SE_NO_ERROR; } } } return SE_HOST_NOT_FOUND; } return SocketError; #else UE_LOG(LogSockets, Error, TEXT("Platform has no getaddrinfo(), but did not override FSocketSubsystem::GetHostByName()")); return SE_NO_RECOVERY; #endif }