9

Swift 3でBonjourを試してみました

これが私のコードです。デリゲートを受け取ることができます

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

そして、これが私の結果です

netServiceDidResolveAddress サービス名 Webber の Mac mini タイプ _myapp._tcp.、ポート 5678、アドレス Optional([<1002162e c0a80205 00000000 00000000>, <1c1e162e 00000000 fe800000 00000000 000bce7ad 24b000>800]8)

c0a80205 は私が探している IP です => 192.168.2.5

そして、アドレスは [Data] です、とAppleは言います

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

なぜ Data が .btyes を使用できないのか、まだ混乱していますか? Apple が言うように、「これは NSData インスタンスの NSArray です」しかし、私は NSData のようには使用できません

そして、アドレスを読み取り可能な IP 文字列として解決する方法は?

以前にこれを試しましたが、例外として結果が得られません...

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));
}

どんな提案も役に立ちます、ありがとう

4

4 に答える 4

4

OK ... これはスマートな答えではありません。少なくとも、読み取り可能な 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;
    }
于 2016-07-06T02:18:24.697 に答える