HTTP Client の動作フロー その1 : gethostbyname()

gethostbyname()って?

manによると、名前解決をするための関数のようです。

#include <netdb.h>
extern int h_errno;

struct hostent *gethostbyname(const char *name);

gethostbyname() 関数は与えられたホスト名 name に対応する構造体 hostent を返す。

引数の name には下記のいずれかを指定できるとのこと

  • ホスト名
  • ドット区切りの IPv4 アドレス
  • コロン区切りの IPv6 アドレス


ようするにこんな感じに使うと、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()関数を使わないといけないみたいですね。
これについては、また後日調べてみます。