2016-06-16 3 views
1

Я могу получить IP-адрес из NSNetService с использованием кода Objective-C в моем проекте Swift. Есть ли код Swift, который может сделать то же самое (во избежание наличия мостового заголовка)? В противном случае я буду продолжать то, что я делаю сейчас, но надеюсь, что это может быть сделано в Swift вместо этого.Быстрый IP-адрес от NSNetService

-(NSString*)IPAddressesFromData:(NSNetService *)service { 
    for (NSData *address in [service addresses]) { 
     struct sockaddr_in *socketAddress = (struct sockaddr_in *) [address bytes]; 
     //NSLog(@"Service name: %@ , ip: %s , port %i", [service name], inet_ntoa(socketAddress->sin_addr), [service port]); 
     NSString *retString = [NSString stringWithFormat:@"%s", inet_ntoa(socketAddress->sin_addr)]; 
     return retString; 
    } 
    return @"Unknown"; 
} 

Обновленный код, который работает:

func netServiceDidResolveAddress(sender: NSNetService) { 
    let theAddress = sender.addresses!.first! as NSData 
    var hostname = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0) 
    if getnameinfo(UnsafePointer(theAddress.bytes), socklen_t(theAddress.length), 
        &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 { 
     if let numAddress = String.fromCString(hostname) { 
      print("Resolved IP address: \(numAddress)") 
     } 
    } 
} 
+1

Посмотрите http://stackoverflow.com/questions/25890533/how-can-i -get-a-real-ip-address-from-dns-query-in-swift для получения строки IP из структуры sockaddr. –

+0

SHazaam! Большое спасибо - я отредактирую свой оригинальный вопрос с обновленным кодом, который работает. –

ответ

0

Вы можете использовать:

func netServiceDidResolveAddress(_ sender: NetService) { 

    var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) 
    guard let data = sender.addresses?.first else { return } 
    do { 
     try data.withUnsafeBytes { (pointer:UnsafePointer<sockaddr>) -> Void in 
      guard getnameinfo(pointer, socklen_t(data.count), &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 else { 
       throw NSError(domain: "domain", code: 0, userInfo: ["error":"unable to get ip address"]) 
      } 
     } 
    } catch { 
     print(error) 
     return 
    } 
    let address = String(cString:hostname) 
    print("\(sender.name) IP:\(address)") 

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