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

标签 swift dns ip-address

我想从 Swift 中的 DNS 查询中获取 IP 地址(如 192.168.0.1 或 87.12.56.50)。我用 100 种不同的方法尝试了 100 次……没有任何帮助,所以我不得不寻求帮助。 到目前为止,这是我的代码:

let host = CFHostCreateWithName(nil,"subdomain.of.stackoverflow.com").takeUnretainedValue();
CFHostStartInfoResolution(host, .Addresses, nil);
var success: Boolean = 0;
let addresses = CFHostGetAddressing(host, &success).takeUnretainedValue() as NSArray;
if(addresses.count > 0){
   let theAddress = addresses[0] as NSData;
   println(theAddress);
}

好的...这些是我尝试实现但未成功的代码的链接: https://gist.github.com/mikeash/bca3a341db74221625f5
How to perform DNS query on iOS
Create an Array in Swift from an NSData Object
Does CFHostGetAddressing() support ipv6 DNS entries?
Do a simple DNS lookup in Swift

最佳答案

您的代码将地址检索为“套接字地址”结构。 getnameinfo() 可用于将地址转换为数字 IP 字符串 (代码回收自 https://stackoverflow.com/a/25627545/1187415 , 现在更新到 Swift 2):

let host = CFHostCreateWithName(nil,"www.google.com").takeRetainedValue()
CFHostStartInfoResolution(host, .Addresses, nil)
var success: DarwinBoolean = false
if 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/Xcode 8 更新:

let host = CFHostCreateWithName(nil,"www.google.com" as CFString).takeRetainedValue()
CFHostStartInfoResolution(host, .addresses, nil)
var success: DarwinBoolean = false
if 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 = false
if 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)
        }
    }
}

关于swift - 如何从 Swift 中的 DNS 查询中获取真实 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890533/

相关文章:

ios - ReactiveCocoa 3 : Map signal to value (Swift)

PHP 面向对象编程 : Providing Domain Entities with "Identity"

math - 确定两个 IP 地址是否在同一子网上 - 是否从 IP 地址中删除前导或尾随 0?

c - 在 C 程序中使用 ping 命令的主机可达性

objective-c - Quartz 事件服务/事件水龙头是否已弃用?

ios - UIImagePickerController 在 allowsEditing 中隐藏正方形选择

ios - 获取 UIPickerView Xcode Swift 中所选组件的索引

redirect - 301重定向与 parking

windows - Windows 浏览器中的 Kerberos SSO 身份验证

c++ - 如何在 C++ 中找到映射网络驱动器的 IP 地址?