Как получить доменное имя из IP-адреса и IP-адрес из доменного имени в задаче C? - PullRequest
3 голосов
/ 26 августа 2010

Я могу получить текущий IP-адрес моего устройства / устройства, которое я использую, - используя ответ на этот вопрос .

Я прошел этот вопрос .Java позволяет получить IP-адрес от доменного имени.Возможно ли это в Objective C?Как?

Второй вопрос: как узнать имя устройства / машины, используя его IP-адрес.Например, у меня есть IP-адрес 192.168.0.74 = Какое имя устройства?в объективе C?

Ответы [ 3 ]

4 голосов
/ 26 августа 2010

Я не уверен, что это лучший способ сделать это, но в основном это работает для меня. Я вставил IP-адреса StackOverflow (69.59.196.211), и он вернул мне stackoverflow.com, но я ввел один из IP-адресов Google (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);

Для адреса может быть несколько имен, поэтому вы не захотите останавливаться на первом найденном адресе.

1 голос
/ 12 августа 2018

Я написал 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
}
0 голосов
/ 20 декабря 2012

Вам нужно прочитать таблицу маршрутизации - в основном так же, как это делает команда "netstat -r".Реализация netstat с открытым исходным кодом - она ​​находится в пакете

network_cmds-396.6

в

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

, поэтому вы можете проверить, что она делает.Шлюз по умолчанию содержит флаг «G», но не должен подключать флаг «I» (когда активны и Wi-Fi, и сотовая сеть, Wi-Fi используется для подключения к Интернету - шлюз сотовой связи не используется и ему присваивается флаг «I»)..

Надеюсь, это поможет.

...