2015-10-22 3 views
1

Я пытаюсь найти IP-адрес компьютера Windows (с именем TEST) в локальной сети Wi-Fi в iOS для smb-целей. Я Bonjour установлен на этой машине окна и, если я введите следующую команду в терминале на моем Mac (на той же Wi-Fi сети):Поиск IP-адреса локального имени хоста Windows на iOS

ping TEST.local 

Я получаю успех ('64 байт из 10.0.1.19: icmp_seq = 285 ttl = 128 раз = 3,327 мс). Обратите внимание на ip (10.0.1.19): он правильно разрешает имя хоста! Пока нет проблем!

Теперь я пытаюсь сделать то же самое на прошивке с помощью CFHostCreateWithName:

NSString *host = @"TEST.local"; 
CFHostRef hostref = CFHostCreateWithName(nil/*or kCFAllocatorDefault, same result...*/,(__bridge CFStringRef)host); 

CFStreamError *err; 
Boolean lookup = CFHostStartInfoResolution(hostref, kCFHostAddresses, err); 
NSArray* addresses = (__bridge NSArray*)CFHostGetAddressing(hostref, &lookup); 


id first = addresses.firstObject; 

if(first!=nil) { 

    struct in_addr *firstaddress = (__bridge struct in_addr *)first; 
    NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(*(firstaddress))]; 
} 

Результатов варьируются от:

  • Сначала он возвращает 2 адрес, как то же самое, и это нонсенс (не где-нибудь около 10.0.1.19, обычно начинается с 8)
  • после этого нет результатов и ошибки (err): err-> domain = 12 и err-> error = 8. Похож на какую-то форму кеширования, не уверен в этом ...

Так что решение хоста отлично работает на Mac, но не работает на устройстве iOS, подключенном к той же сети ... Я что-то пропустил?

+0

Я подозреваю, что преобразование из '' NSArray' для структуры in_addr' здесь. – trojanfoe

ответ

1

В принципе, вы можете получить имя хоста с помощью этого:

NSString* hostname = @"Mac-mini.local"; 

CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFStringRef)hostname); 
Boolean lookup = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); 

if (lookup) { 
    CFArrayRef addresses = CFHostGetAddressing(hostRef, &lookup); 

    struct sockaddr_in *remoteAddr; 

    for(int i = 0; i < CFArrayGetCount(addresses); i++) { 
     CFDataRef saData = (CFDataRef)CFArrayGetValueAtIndex(addresses, i); 
     remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData); 
     if(remoteAddr != NULL){ 
      NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(remoteAddr->sin_addr)]; 
      NSLog(@"dns:%@",strDNS); 
     } 
    } 

    CFRelease(addresses); 
} 

В вашем случае вам придется изменить его таким образом:

NSString *host = @"TEST.local"; 
CFHostRef hostref = CFHostCreateWithName(kCFAllocatorDefault,(__bridge CFStringRef)host); 

CFStreamError *err; 
Boolean lookup = CFHostStartInfoResolution(hostref, kCFHostAddresses, err); 
NSArray* addresses = (__bridge NSArray*)CFHostGetAddressing(hostref, &lookup); 

if(addresses.firstObject!=nil) { 
    struct sockaddr_in *firstaddress = (struct sockaddr_in*)CFDataGetBytePtr((__bridge CFDataRef)addresses.firstObject); 
    NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(firstaddress->sin_addr)]; 
} 
+0

Спасибо, это сработало! я неправильно выбрал адрес. редактирование: когда я запустил приложение во второй раз, адреса не найдены :( –

+0

Кажется, что если я положу этот код через некоторое время, пока не найду ip, спасибо за вашу помощь! –

Смежные вопросы