2016-07-05 5 views
5

が私のコードですが、私は、デリゲートスイフト3 NetService IPを解決する方法は?ただ、ここで迅速な3</p> <p>でのBonjourをしようと

func netServiceDidResolveAddress(_ sender: NetService) { 
print("netServiceDidResolveAddress service name \(sender.name) of type \(sender.type)," + 
       "port \(sender.port), addresses \(sender.addresses)") 
} 

を受け取ることができ、ここに私の結果は

netServiceDidResolveAddressサービス名ウェバーのMac miniタイプの _myappです._tcp。、ポート5678、アドレスオプション([< 1002162e c0a80205 00000000 00000000>、< 1c1e162e 00000000 fe800000 00000000 00bce7ad 24b4b7e8 08000000>])

c0a80205はIP私は=> 192.168.2.5

を探していると、アドレスが[データ]で、アップルはサービスの

アドレスを言います。 NSDataインスタンスのNSArray、 それぞれには、 connect(2)で使用するのに適した単一のstruct sockaddrが含まれています。 サービスでアドレスが解決されていない場合、またはサービスがまだ解決されていない場合は、空のNSArrayは です。

なぜ、データで.btyesを使用できないのか混乱しますか? アップルは "これはNSDataインスタンスのNSArrayです" しかし、私はNSDataのように使用することはできません

そして、読み取り可能なIP文字列としてアドレスを解決するにはどうすればいいですか?

私は、OK ...これはスマートな答えはない

let thedata = NSData(bytes: sender.addresses, length: (sender.addresses?.count)!) 
var storage = sockaddr_storage() 
thedata.getBytes(&storage, length: sizeof(sockaddr_storage)) 

if Int32(storage.ss_family) == AF_INET { 
    let addr4 = withUnsafePointer(&storage) {UnsafePointer<sockaddr_in>($0).pointee } 
    print(inet_ntoa(addr4.sin_addr)); 
} 

任意の提案が助けになり、おかげで

答えて

2

...前にこれを試して、しかし以外私として結果を得ることはありません少なくとも私には読めるIP

ちょうどこれは私ができるIP文字列

let bonjourDevices = [NetService]() 

let bonjourDevice = bonjourDevices[0] 

let host = self.getIPV4StringfromAddress(address:bonjourDevice.addresses!) 


func getIPV4StringfromAddress(address: [Data] , port : Int) -> String{ 

     let data = address.first! as NSData; 

     var ip1 = UInt8(0) 
     data.getBytes(&ip1, range: NSMakeRange(4, 1)) 

     var ip2 = UInt8(0) 
     data.getBytes(&ip2, range: NSMakeRange(5, 1)) 

     var ip3 = UInt8(0) 
     data.getBytes(&ip3, range: NSMakeRange(6, 1)) 

     var ip4 = UInt8(0) 
     data.getBytes(&ip4, range: NSMakeRange(7, 1)) 

     let ipStr = String(format: "%d.%d.%d.%d:%d",ip1,ip2,ip3,ip4,port); 

     return ipStr; 
    } 
2

を取得するには、FUNC使用し得ることができます「Tは、それがDataで動作させるが、NSDataを使用して、私はこの使用します。

extension NSData { 
    func castToCPointer<T>() -> T { 
     let mem = UnsafeMutablePointer<T>.allocate(capacity: MemoryLayout<T.Type>.size) 
     self.getBytes(mem, length: MemoryLayout<T.Type>.size) 
     return mem.move() 
    } 
} 

をだから我々はnetServiceDidResolveAddressを持っている:

func netServiceDidResolveAddress(_ sender: NetService) { 
    if let addresses = sender.addresses, addresses.count > 0 { 
     for address in addresses { 
      let data = address as NSData 

      let inetAddress: sockaddr_in = data.castToCPointer() 
      if inetAddress.sin_family == __uint8_t(AF_INET) { 
       if let ip = String(cString: inet_ntoa(inetAddress.sin_addr), encoding: .ascii) { 
        // IPv4 
        print(ip) 
       } 
      } else if inetAddress.sin_family == __uint8_t(AF_INET6) { 
       let inetAddress6: sockaddr_in6 = data.castToCPointer() 
       let ipStringBuffer = UnsafeMutablePointer<Int8>.allocate(capacity: Int(INET6_ADDRSTRLEN)) 
       var addr = inetAddress6.sin6_addr 

       if let ipString = inet_ntop(Int32(inetAddress6.sin6_family), &addr, ipStringBuffer, __uint32_t(INET6_ADDRSTRLEN)) { 
        if let ip = String(cString: ipString, encoding: .ascii) { 
         // IPv6 
         print(ip) 
        } 
       } 

       ipStringBuffer.deallocate(capacity: Int(INET6_ADDRSTRLEN)) 
      } 
     } 
    } 
} 

私は(表示する前に、アレイにIPSを格納)は、次の結果を持っています:https://gist.github.com/agrippa1994/d8c66a2ded74fb2dd801スウィフト2.3で書かれており、スウィフト3.0

のために適合さに触発さ

["172.16.10.120", "172.16.8.251", "::", "::82c9:d9a5:2eed:1c87"] 

コード

7

ここで私はスウィフト3.

func netServiceDidResolveAddress(_ sender: NetService) { 
    var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) 
    guard let data = sender.addresses?.first else { return } 
    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 { 
      return 
     } 
    } 
    let ipAddress = String(cString:hostname) 
    print(ipAddress) 
} 
でそれをやった方法です
関連する問題