我试图在swift中做一个简单的DNS查找。到目前为止,这里是我的代码:将NSData转换为swift中的sockaddr结构体
let hostRef = CFHostCreateWithName(kCFAllocatorDefault, "google.com").takeRetainedValue()
var resolved = CFHostStartInfoResolution(hostRef, CFHostInfoType.Addresses, nil)
let addresses = CFHostGetAddressing(hostRef, &resolved).takeRetainedValue() as NSArray
在这一点上,每一个元素中的“地址”的NSArray是一个CFDataRef对象包装一个套接字地址结构。
由于CFDataRef可拨打免费电话桥接NSData的,我可以通过他们循环,像这样:
for address: AnyObject in addresses {
println(address) // address is of type NSData.
}
到目前为止好(我认为)。当我在单元测试中运行它时打印出有效的外观数据。这里是我卡住的地方。对于我的生活,我无法弄清楚如何将NSData对象中的字节转换为sockaddr结构体。
如何将address.bytes(类型为COpaquePointer?)转换为c结构?任何帮助赞赏。试图弄清楚这一点,我正在撞墙。
这甚至可以简化为:data.getBytes (&addr,长度:sizeof(sockaddr)) – kgreenek
好点。我更新了我的答案,并且还添加了有关做同样的事情的信息,而无需首先初始化结构。 – jtbandes
对于它的价值,你可能不想使用sockaddr - 但是你得到的实际sockaddr结构。像sockaddr_in或sockaddr_un。否则,你可能会遇到缓冲区溢出。也许你会发现这个扩展是有用的:https://github.com/AlwaysRightInstitute/SwiftSockets/blob/master/ARISockets/SocketAddress.swift – hnh