Swift 3如何解决NetService IP? [英] Swift 3 how to resolve NetService IP?

查看:248
本文介绍了Swift 3如何解决NetService IP?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在swift 3中尝试Bonjour

Just trying Bonjour in swift 3

这是我的代码,我可以收到代表

Here is my code , I can receive the delegate

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 ,地址可选([< 1002162e c0a80205 00000000 00000000>,< 1c1e162e 00000000 fe800000 00000000 00bce7ad
24b4b7e8 08000000>])

netServiceDidResolveAddress service name Webber's Mac mini of type _myapp._tcp.,port 5678, addresses Optional([<1002162e c0a80205 00000000 00000000>, <1c1e162e 00000000 fe800000 00000000 00bce7ad 24b4b7e8 08000000>])

c0a80205是我要找的IP => 192.168.2.5

c0a80205 is the IP I looking for => 192.168.2.5

地址是[数据],Apple说

And the address is [Data] , Apple says


服务的地址。这是NSData实例的NSArray,
,每个实例包含一个适合与
connect(2)一起使用的struct sockaddr。如果没有为
服务解析地址或服务尚未解决,则返回空的NSArray

The addresses of the service. This is an NSArray of NSData instances, each of which contains a single struct sockaddr suitable for use with connect(2). In the event that no addresses are resolved for the service or the service has not yet been resolved, an empty NSArray is returned.

我仍然混淆为什么数据不能使用.btyes?
正如Apple所说这是NSData实例的NSArray
但我不能像NSData一样使用它

I still confuse why Data can't use .btyes ? As Apple says "This is an NSArray of NSData instances" But I can't use it like NSData

以及如何解析地址作为可读的IP字符串?

And how to resolve the address as readable IP string ?

我之前尝试过这个,但是除了...之外没有得到结果...

I try this before , but do not get the result as I except ...

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

任何建议都会有所帮助,谢谢

Any suggestion will be help , Thanks

推荐答案

以下是我在Swift 3中的表现。

Here's how I did it in Swift 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)
}

这篇关于Swift 3如何解决NetService IP?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆