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 がそのメモリを独自のもので上書きしてはならないことをどのように知ることができますか? freeaddrinfo
リスト全体を削除し、結果配列に割り当てられた ai 情報をコピーする必要があることを、Swift はどのように知ることができますか?
とインターフェースする正しい方法は何getaddrinfo
ですか?