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

我想从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);

}

回答:

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

getnameinfo()可用于将地址转换为数字IP字符串回收的代码,现已更新为 ):

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)保留的对象。


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中从DNS查询中获取真实IP地址? 的全部内容, 来源链接: utcz.com/qa/404809.html

回到顶部