代码之家  ›  专栏  ›  技术社区  ›  sagarkothari

如何从目标C中的域名中获取IP地址和IP地址的域名?

  •  3
  • sagarkothari  · 技术社区  · 14 年前

    我可以通过-获取我正在使用的设备/计算机的当前IP地址 using this question's answer .

    我经历过 this question . Java允许从域名获取IP地址。目标C中有可能吗?怎么用?

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

    3 回复  |  直到 6 年前
        1
  •  4
  •   dreamlax    14 年前

    我不确定这是不是最好的方法,但对我来说,大多数情况下是可行的。我输入stackoverflow的IP地址(69.59.196.211),它返回给我 stackoverflow.com 但是我输入了谷歌的一个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);
    

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

        2
  •  1
  •   powerj1984    6 年前

    我写了一个被接受的答案的快速版本,尽管我不能百分之百地肯定它的正确性。

    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
  •  0
  •   J0k3R    12 年前

    您需要读取路由表——基本上与“netstat-r”命令相同。netstat实现是开放源码的-它在包中

    网络指挥官-396.6

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

    所以你可以检查一下它的作用。默认网关包含“G”标志,但不应连接“I”标志(当WiFi和蜂窝都处于活动状态时,WiFi用于互联网连接-蜂窝网关不使用,并被授予“I”标志)。

    希望它有帮助。