如何在Objective C中获取IP地址的域名和从域名获取IP地址?

3
我可以通过这个问题的答案获取我正在使用的设备/机器的当前IP地址。
我已经浏览了这个问题。Java允许从域名获取IP地址。在Objective C中是否可能?如何实现?
第二个问题是如何通过IP地址获取设备/机器的名称。例如,我有一个IP地址192.168.0.74=什么是设备名称?在Objective C中如何实现?
3个回答

5

我不确定这是否是最好的方法,但它对我来说有效,大多数情况下。我输入了StackOverflow的IP地址(69.59.196.211),然后它给了我stackoverflow.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
@Niks:是的,getaddrinfo可以用来从域名获取IP。 - dreamlax
谢谢回复,让我来确认一下。 - Niks
@dreamlax 我们能从IP地址获取主机名吗? - Vaisakh
@dreamlax 这个域名的IP地址怎么获取?它会返回IPv4和IPv6吗? - Bob The Coder

1

我写了一个Swift版本的被接受的答案,但我不确定它的正确性。

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
}

0

您需要读取路由表 - 基本上与 "netstat -r" 命令执行的方式相同。 netstat 实现是开源的 - 它在软件包中。

network_cmds-396.6

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

这样你就可以检查它的功能。默认网关包含“G”标志,但不应连接“I”标志(当wifi和移动网络同时激活时,使用wifi进行互联网连接 - 移动网络网关不会被使用并且被赋予“I”标志)。

希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接