HTTP Client の動作フロー その1 : gethostbyname()
gethostbyname()って?
manによると、名前解決をするための関数のようです。
#include <netdb.h> extern int h_errno; struct hostent *gethostbyname(const char *name); gethostbyname() 関数は与えられたホスト名 name に対応する構造体 hostent を返す。
引数の name には下記のいずれかを指定できるとのこと
ようするにこんな感じに使うと、hostentという構造体を返してくれるようです。
struct hostent *hostent; hostent = gethostbyname("google.com");
で、hostentってなんだ?
hostent 構造体は
で以下のように定義されている: struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
}
#define h_addr h_addr_list[0] /* 過去との互換性のため */
hostent 構造体のメンバは以下の通り。h_name
ホストの正式名 (official name)。
h_aliases
ホストの別名の配列。配列は NULL ポインタで終端される。
h_addrtype
アドレスのタイプ。現在はすべて AF_INET または AF_INET6 である。
h_length
バイト単位で表したアドレスの長さ。
h_addr_list
ホストのネットワークアドレスへのポインタの配列。 配列は NULL ポインタで終端される。 ネットワークアドレスはネットワークバイトオーダ形式である。
h_addr
h_addr_list の最初のアドレス。過去との互換性を保つためのものである。
今回使用されているのが下記の2つ。
- h_addr_list : 名前解決されたipアドレスへのポインタ配列
- h_length : アドレスの長さ(単位=バイト)
で、この情報が具体的にどのように使われているのかは、次回。
でも...
manには下記のような記述が...
gethostbyname*() は過去のものである。 アプリケーションでは、代わりに getaddrinfo(3) と getnameinfo(3) を使用すること。
うーん、getnameinfo()関数を使わないといけないみたいですね。
これについては、また後日調べてみます。