木曜の演習,内容や進め方は基本的に昨年度から変更しないのですが,コードは変更しようと思って,これまで,情報収集をしたり,自分でもコードを書いてみたりしました.
昨日やっとその目途が立ちました.
gethostbynameは,"get host by name" と分解して読むように,ホスト名を入力にとり,ホスト情報を返す関数です.IPv4にしか対応していないのと,再入可能でない*1ので連続して呼び出せないという問題があります.
getaddrinfoは上記の問題を解決しています.得られた値が,『bind(2) や connect(2) などの関数コールでクライアント用やサーバー用のソケットを生成する際に用いることができる』(http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getaddrinfo.3.htmlより)のも,魅力です.
なのですがその分,入力や出力のデータ構造ががらりと変わるので,解説は作り直しです.gethostbynameで得られるhostent構造体は,IPアドレスの配列を持つのに対して,getaddrinfoで得られるaddrinfo構造体は,線形リストにより,複数の戻り値を保有しています.
getaddrinfoのデメリットを一つ,挙げると,獲得した内容が不要になったら,freeaddrinfoを呼び出さないといけないことです.まあ,データを動的に確保するのに応分のコストではありますが.