如何从 Swift 中的 DNS 查询中获取真实 IP 地址? [英] How can I get a real IP address from DNS query in Swift?
问题描述
我想从 Swift 的 DNS 查询中获取 IP 地址(如 192.168.0.1 或 87.12.56.50).我用 100 种不同的方法尝试了 100 次......没有任何帮助,所以我不得不寻求帮助.到目前为止,这是我的代码:
I want to get the IP address (like 192.168.0.1 or 87.12.56.50) from DNS query in Swift. I tried 100 times with 100 different methods ... Nothing helped me, so I'll have to ask for help. This is my code so far:
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
如何在 iOS 上执行 DNS 查询
在 Swift 中从 NSData 对象创建数组
CFHostGetAddressing() 是否支持 ipv6 DNS 条目?
在 Swift 中进行简单的 DNS 查找
OK ... These are the links for the code I tried to implement without success:
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):
Your code retrieves the address as a "socket address" structure.
getnameinfo()
can be used to convert the address into a numerical IP string
(code recycled from https://stackoverflow.com/a/25627545/1187415,
now updated to 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) 保留对象.
Note also the usage of takeRetainedValue()
in the first line, because
CFHostCreateWithName()
has "Create" in its name the therefore returns a (+1) retained
object.
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地址:
Or, to get all IP addresses for the host:
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 中的 DNS 查询中获取真实 IP 地址?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!