我試圖在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