POSIX getaddrinfo
分配內存,必須稍後使用freeaddrinfo
釋放內存。 見http://manpages.ubuntu.com/manpages/xenial/en/man3/getaddrinfo.3.htmlSwift getaddrinfo
爲了簡化API,我創建了這個功能:
import Foundation
enum SystemError: Swift.Error {
case getaddrinfo(Int32, Int32?)
}
public func getaddrinfo(node: String?, service: String?, hints: addrinfo?) throws -> [addrinfo] {
var err: Int32
var res: UnsafeMutablePointer<addrinfo>?
if var hints = hints {
err = getaddrinfo(node, service, &hints, &res)
} else {
err = getaddrinfo(node, service, nil, &res)
}
if err == EAI_SYSTEM {
throw SystemError.getaddrinfo(err, errno)
}
if err != 0 {
throw SystemError.getaddrinfo(err, nil)
}
defer {
freeaddrinfo(res)
}
var result = [addrinfo]()
var ai = res?.pointee
while ai != nil {
result.append(ai!)
ai = ai!.ai_next?.pointee
}
return result
}
我不覺得功能是正確的,雖然。
- Swift內存模型如何知道
getaddrinfo
分配內存,並且Swift不應該用自己的東西覆蓋該內存? - Swift如何知道
freeaddrinfo
刪除了整個列表,並且它應該複製已分配給結果數組的ai信息?
什麼是與getaddrinfo
接口的正確方法?通過getaddrinfo
(例如通過malloc
)分配
這與您的答案是相切的,但是:您在哪裏得到了'addrinfo'字段的Swift版本?你只是手工重寫它們,還是有一種工具可以將C++代碼的Swift界面顯示出來? (本週我正在處理Swift中的C,並且很想知道。) –
@JoshCaswell:我不確定我是否理解你的問題。在導入Swift時,按住Command鍵點擊'addrinfo'就會顯示標題。 - 您還可以將#import'添加到任何C文件中,通過命令單擊「netdb.h」跳轉到該文件,然後選擇「生成的接口」。 –
Xcode中的「生成的接口」是我缺少的一部分,謝謝! –