栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Swift中从DNS查询中获取真实IP地址?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Swift中从DNS查询中获取真实IP地址?

您的代码将地址检索为“套接字地址”结构。

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/368052.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号