您的代码将地址检索为“套接字地址”结构。
getnameinfo()可用于将地址转换为数字IP字符串回收的代码,现已更新为Swift 2 ):
let host = CFHostCreateWithName(nil,"www.google.com").takeRetainedValue()CFHostStartInfoResolution(host, .Addresses, nil)var success: DarwinBoolean = falseif let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray?, let theAddress = addresses.firstObject 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(numAddress) } }}
输出(示例):
173.194.112.147
还要注意
takeRetainedValue()第一行的用法,因为名称中
CFHostCreateWithName()带有“
Create”,因此返回一个(+1)保留的对象。
Swift 3 / Xpre 8更新:
let host = CFHostCreateWithName(nil,"www.google.com" as CFString).takeRetainedValue()CFHostStartInfoResolution(host, .addresses, nil)var success: DarwinBoolean = falseif let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray?, let theAddress = addresses.firstObject as? NSData { var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) if getnameinfo(theAddress.bytes.assumingMemoryBound(to: sockaddr.self), socklen_t(theAddress.length), &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 { let numAddress = String(cString: hostname) print(numAddress) }}
或者,要获取主机的 所有 IP地址:
let host = CFHostCreateWithName(nil,"www.google.com" as CFString).takeRetainedValue()CFHostStartInfoResolution(host, .addresses, nil)var success: DarwinBoolean = falseif let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray? { for case let theAddress as NSData in addresses { var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) if getnameinfo(theAddress.bytes.assumingMemoryBound(to: sockaddr.self), socklen_t(theAddress.length), &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 { let numAddress = String(cString: hostname) print(numAddress) } }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)