【问题标题】:How to get Domain Name of IP address and IP address from Domain Name in Objective C?如何从Objective C中的域名获取IP地址的域名和IP地址?
【发布时间】:2011-04-04 02:46:03
【问题描述】:

我能够通过using this question's answer 获取我正在使用的设备/机器的当前 IP 地址。

我已经通过this question。 Java 允许从域名中获取 IP 地址。在Objective C中可能吗?怎么样?

第二个问题是如何通过 IP 地址获取设备/机器的名称。例如,我有一个 IP 地址 192.168.0.74 = 设备名称是什么?在目标 C 中?

【问题讨论】:

    标签: iphone objective-c network-programming dns ip-address


    【解决方案1】:

    我不确定这是否是最好的方法,但它主要对我有用。我输入了 * 的 IP 地址 (69.59.196.211),它返回了 *.com,但我输入了 Google 的一个 IP 地址 (210.55.180.158),它返回了 cache.googlevideo.com(对于所有结果,不仅仅是第一个)。

    int error;
    struct addrinfo *results = NULL;
    
    error = getaddrinfo("69.59.196.211", NULL, NULL, &results);
    if (error != 0)
    {
        NSLog (@"Could not get any info for the address");
        return; // or exit(1);
    }
    
    for (struct addrinfo *r = results; r; r = r->ai_next)
    {
        char hostname[NI_MAXHOST] = {0};
        error = getnameinfo(r->ai_addr, r->ai_addrlen, hostname, sizeof hostname, NULL, 0 , 0);
        if (error != 0)
        {
            continue; // try next one
        }
        else
        {
            NSLog (@"Found hostname: %s", hostname);
            break;
        }
    }
    
    freeaddrinfo(results);
    

    地址可以有多个名称,因此您可能不想停留在找到的第一个名称。

    【讨论】:

    • 我们可以从域名获取IP吗?
    • @Niks:是的,getaddrinfo 可用于从域名中获取 IP。
    • 感谢您的回复,让我检查一下。
    • @dreamlax 我们可以从 ipAddress 获取主机名吗?
    【解决方案2】:

    我写了一个已接受答案的 Swift 版本,尽管我不能 100% 确定它的正确性。

    func reverseDNS(ip: String) -> String {
        var results: UnsafeMutablePointer<addrinfo>? = nil
        defer {
            if let results = results {
                freeaddrinfo(results)
            }
        }
        let error = getaddrinfo(ip, nil, nil, &results)
        if (error != 0) {
            print("Unable to reverse ip: \(ip)")
            return ip
        }
    
        for addrinfo in sequence(first: results, next: { $0?.pointee.ai_next }) {
            guard let pointee = addrinfo?.pointee else {
                print("Unable to reverse ip: \(ip)")
                return ip
            }
    
            let hname = UnsafeMutablePointer<Int8>.allocate(capacity: Int(NI_MAXHOST))
            defer {
                hname.deallocate()
            }
            let error = getnameinfo(pointee.ai_addr, pointee.ai_addrlen, hname, socklen_t(NI_MAXHOST), nil, 0, 0)
            if (error != 0) {
                continue
            }
            return String(cString: hname)
        }
    
        return ip
    }
    

    【讨论】:

      【解决方案3】:

      你需要读取路由表——基本上和“netstat -r”命令一样。 netstat 实现是开源的 - 它在包中

      network_cmds-396.6

      http://www.opensource.apple.com/release/mac-os-x-1082/

      所以你可以检查它的作用。默认网关包含“G”标志,但不应连接“I”标志(当 wifi 和 cell 都处于活动状态时,wifi 用于互联网连接 - 不使用 cell 网关并给出“I”标志) .

      希望对你有帮助。

      【讨论】: