POSIXgetaddrinfo
分配内存,以后必须使用freeaddrinfo
. 请参阅http://manpages.ubuntu.com/manpages/xenial/en/man3/getaddrinfo.3.html
为了简化 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
?