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

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

如何在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)        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4896638.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存