3

POSIXgetaddrinfoは、後で を使用して解放する必要があるメモリを割り当てますfreeaddrinfohttp://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ですか?

4

1 に答える 1