iOS. получить другое имя устройства / компьютера по IP в той же локальной сети

Одна из задач моей программы - сканировать локальную сеть Wi-Fi на предмет любых устройств / компьютеров в той же сети. Я нашел решение получить IP-адреса всех рабочих устройств, но не смог получить их имена. Я не нашел подсказки, как решить эту проблему. Какие-либо предложения?


person Nikolay Shubenkov    schedule 15.10.2013    source источник
comment
Как вы получили список всех работающих устройств? какой код использовался для сканирования. Я перепробовал много кода из Интернета, но не смог получить этот @Nikolay Shubenkov   -  person dev    schedule 29.10.2014
comment
Определите свой IP. Если ваш IP-адрес, например, 192.168.2.44, проверьте связь со всеми IP-адресами с адресами от 192.168.2.1 до 192.168.2.255. если вам нужен код, создайте вопрос в StackOverflow, опубликуйте ссылку на этот вопрос, и я опубликую проект в github и поставлю ссылку на этот проект в ответ на ваш вопрос.   -  person Nikolay Shubenkov    schedule 30.10.2014
comment
Вот ссылка на этот вопрос. @ Николай Шубенков   -  person dev    schedule 11.06.2015
comment
@NikolayShubenkov вам удалось получить имя компьютера с IP-адреса?   -  person Darshan Kunjadiya    schedule 16.09.2016
comment
К сожалению нет. По крайней мере, сейчас. Это довольно старый вопрос, и я не могу его перепроверить, так как проект с кодом просто не компилируется.   -  person Nikolay Shubenkov    schedule 16.09.2016
comment
Удалось ли кому-нибудь получить имя хоста?   -  person Mehsam Saeed    schedule 26.11.2018


Ответы (2)


Чтобы выполнить обратный поиск в DNS, вам необходимо вызвать функцию CFHostGetNames, например:

+ (NSArray *)hostnamesForIPv4Address:(NSString *)address
{
    struct addrinfo *result = NULL;
    struct addrinfo hints;

    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_NUMERICHOST;
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;

    int errorStatus = getaddrinfo([address cStringUsingEncoding:NSASCIIStringEncoding], NULL, &hints, &result);
    if (errorStatus != 0) {
        return nil;
    }

    CFDataRef addressRef = CFDataCreate(NULL, (UInt8 *)result->ai_addr, result->ai_addrlen);
    if (addressRef == nil) {
        return nil;
    }
    freeaddrinfo(result);

    CFHostRef hostRef = CFHostCreateWithAddress(kCFAllocatorDefault, addressRef);
    if (hostRef == nil) {
        return nil;
    }
    CFRelease(addressRef);

    BOOL succeeded = CFHostStartInfoResolution(hostRef, kCFHostNames, NULL);
    if (!succeeded) {
        return nil;
    }

    NSMutableArray *hostnames = [NSMutableArray array];

    CFArrayRef hostnamesRef = CFHostGetNames(hostRef, NULL);
    for (int currentIndex = 0; currentIndex < [(__bridge NSArray *)hostnamesRef count]; currentIndex++) {
        [hostnames addObject:[(__bridge NSArray *)hostnamesRef objectAtIndex:currentIndex]];
    }

    return hostnames;
}
person neilco    schedule 15.10.2013
comment
Я пробовал ваш код, но всегда получаю от этой функции нулевое значение. Я пытаюсь получить имя компьютера в приложении iOS. Не могли бы вы предложить мне правильный способ найти имя компьютера. Спасибо - person Darshan Kunjadiya; 16.09.2016
comment
Вышеупомянутая функция не может получить имя хоста для некоторой сети в этот момент и вернуть значение null. BOOL выполнено успешно = CFHostStartInfoResolution (hostRef, kCFHostNames, NULL); если (! удалось) {вернуть ноль; }. любая идея почему - person Mehsam Saeed; 26.11.2018

BOOL succeeded = CFHostStartInfoResolution(hostRef, kCFHostNames, NULL); Теперь я сталкиваюсь с тем, что всегда терпит неудачу в этой строке, и я пытался использовать getnameinfo функцию, она все еще не может получить имя хоста

person carya.liu    schedule 28.01.2015