简体   繁体   English

gethostbyname()在iOS6中失败

[英]gethostbyname( ) failed in iOS6

I use gethostbyname() to get the device IP. 我使用gethostbyname()来获取设备IP。 In iOS5, it works well. 在iOS5中,它运作良好。 But in iOS6, the host value returned by gethostbyname() is NULL. 但在iOS6中,gethostbyname()返回的主机值为NULL。 Below is my code to get the current local IP of the device. 下面是我获取设备当前本地IP的代码。

// retun the host name
- (NSString *)hostname
{
    char baseHostName[256];
    int success = gethostname(baseHostName, 255);
    if (success != 0) return nil;
    baseHostName[255] = '\0';

#if !TARGET_IPHONE_SIMULATOR
    return [NSString stringWithFormat:@"%s.local", baseHostName];
#else
    return [NSString stringWithFormat:@"%s", baseHostName];
#endif
}

// return IP Address
- (NSString *)localIPAddress
{
    struct hostent *host = gethostbyname([[self hostname] UTF8String]);
    if (!host) {
        herror("resolv");
        return nil;
    }
    struct in_addr **list = (struct in_addr **)host->h_addr_list;
    return [NSString stringWithCString:inet_ntoa(*list[0]) encoding:NSUTF8StringEncoding];
}

Notice that, simulator works for both iOS5 and iOS6. 请注意,模拟器适用于iOS5和iOS6。 Only iOS6 device failed. 只有iOS6设备失败。 What's the difference for the gethostbyname()? gethostbyname()有什么区别? Or do you have any other solution to get local ip in iOS6? 或者你有任何其他解决方案来获得iOS6中的本地IP?

There are several possible problems: 有几个可能的问题:

  • Perhaps you have an IPv6 address ( gethostbyname() works only with IPv4), 也许您有一个IPv6地址( gethostbyname()仅适用于IPv4),
  • or the name resolution from the hostname to IP address does not work correctly. 或从主机名到IP地址的名称解析无法正常工作。

The following code returns all local addresses as an array of strings. 以下代码将所有本地地址作为字符串数组返回。 It does not depend on name resolution and works with both IPv4 and IPv6 addresses. 它不依赖于名称解析,并且可以与IPv4和IPv6地址一起使用。

#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <netdb.h>

// return all local IP addresses
- (NSArray *)localIPAddresses
{
    NSMutableArray *ipAddresses = [NSMutableArray array] ;

    struct ifaddrs *allInterfaces;

    // Get list of all interfaces on the local machine:
    if (getifaddrs(&allInterfaces) == 0) {
        struct ifaddrs *interface;

        // For each interface ...
        for (interface = allInterfaces; interface != NULL; interface = interface->ifa_next) {
            unsigned int flags = interface->ifa_flags;
            struct sockaddr *addr = interface->ifa_addr;

            // Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
            if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) {
                if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) {

                    // Convert interface address to a human readable string:
                    char host[NI_MAXHOST];
                    getnameinfo(addr, addr->sa_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST);

                    [ipAddresses addObject:[[NSString alloc] initWithUTF8String:host]];
                }
            }
        }

        freeifaddrs(allInterfaces);
    }
    return ipAddresses;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM