INET(3)

名称
inet_aton, inet_addr, inet_network, inet_ntoa, inet_ntop, inet_pton, inet_makeaddr, inet_lnaof, inet_netof - インターネットアドレス操作関数

ライブラリ
libc

書式
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_aton(const char *cp, struct in_addr *pin) unsigned long inet_addr(const char *cp) unsigned long inet_network(const char *cp) char * inet_ntoa(struct in_addr in) const char * inet_ntop(int af, const void *src, char *dst, size_t size) int inet_pton(int af, const char *src, void *dst) struct in_addr inet_makeaddr(unsigned long net, unsigned long lna) unsigned long inet_lnaof(struct in_addr in) unsigned long inet_netof(struct in_addr in)

解説
inet_aton(), inet_addr() および inet_network() ルーチンは、インターネット標準の ‘’. 表記法で示される数値を表現している文字列を解釈します。

inet_pton() 関数は、表示形式のアドレス (つまり文字列で保持されている印字可能な形式) から ネットワーク形式 (通常 struct in_addr もしくは他の内部的なバイナリ表現形式で、ネットワークバイトオーダ) への 変換を行います。 この関数は、指定されたアドレスファミリにおいて、アドレスが 有効なものであれば 1 を返し、パースできなければ 0 を返します。 またシステムエラーが発生した時 (この場合は errno が設定されます) には、-1 を返します。 この関数は現在 AF_INET と AF_INET6 に対して有効です。

inet_aton() ルーチンは、指定された文字列をインターネットアドレスとして解釈し、 与えられた構造体の中にアドレスを設定します。 文字列が正常に解釈されると同ルーチンは 1 を返し、 文字列が無効のとき 0 を返します。 inet_addr() と inet_network() 関数はそれぞれ、 インターネットアドレスとインターネットネットワーク番号として使うのに 適した数値を返します。

inet_ntop() 関数は、ネットワーク形式 (通常 struct in_addr もしくは他の内部的なバイナリ形式で、ネットワークバイトオーダ) から 表示形式 (外部に表示するのに適した形式) への変換を行います。 この関数は、システムエラーが発生した時 (この場合は errno が設定されます) にはヌルを返し、それ以外の時は目的の文字列への ポインタを返します。 この関数は現在 AF_INET と AF_INET6 に対して有効です。

inet_ntoa() ルーチンは、インターネットアドレスを受け取り ‘’. 表記法のアドレスを示す ASCII 文字列を返します。 inet_makeaddr() ルーチンはインターネットネットワーク番号と ローカルネットワークアドレスを受け取り、 それを基にしてインターネットアドレスを生成します。 inet_netof() と inet_lnaof() ルーチンはインターネットホストアドレスを分割して、 それぞれネットワーク番号とローカルネットワークアドレス部として返します。

すべてのインターネットアドレスはネットワークオーダ ( 左から右への バイト順 ) で返されます。 ネットワーク番号とローカルアドレス部はすべてマシン形式の整数値で 返されます。

インターネットアドレス
‘’. 表記法で指定される値は次のどれか一つの形式を取ります。

    a.b.c.d
    a.b.c
    a.b
    a

4 個の部分アドレスが指定されると、各部分は 1 バイトのデータと解釈されて、 左から右の順でインターネットアドレスの 4 バイトに割り当てられます。 インターネットアドレスが VAX 上で 32 ビットの整数値であると見なされるとき、上記に該当するバイトは、 “d.c.b.a” と表示されることに注意して下さい。 すなわち、 VAX のバイトオーダは右から左の順になります。

3 個の部分アドレスが指定されると、最後の部分が 16 ビット値と解釈されて、 ネットワークアドレスの右端の 2 バイトになります。 これにより 3 つの部分アドレス形式で Class B ネットワークアドレスを “128.net.host” と指定でき、便利です。

2 個の部分アドレスが与えられると、最後の部分アドレスが 24 ビット値として 解釈されて、ネットワークアドレスの右端の 3 バイトになります。 これにより 2 個の部分アドレス形式で Class A ネットワークアドレスを “net.host” と指定でき、便利です。

1 個の部分アドレスだけ指定されると、値はバイトの再調整なしに 直接ネットワークアドレスに保存されます。

‘’. 表記法で “部分” として供給される数値はすべて、C 言語で指定される 10 進数、8 進数、16 進数の いずれかの形式を取ることができます (すなわち、先行の 0x または 0X は 16 進数を意味し、 先行する 0 は 8 進数を意味し、数値は 10 進数と解釈されます) 。

inet_aton() と inet_ntoa() 関数は幾分避けるべき関数で、むしろ addr2ascii(3) ファミリが使われます。 しかし、これらの関数はまだ広く実装されていないため、 当面、移植性のあるプログラムはこれらの関数に依存できず、 inet(3) 関数が使われ続けるでしょう。

診断
inet_addr() と inet_network() は形式違反の要求に対し INADDR_NONE 定数を返します。

関連項目
addr2ascii(3), gethostbyname(3), getnetent(3), hosts(5), networks(5) RFC, 2373, July 1998, IP Version 6 Addressing Architecture.

規格
inet_ntop() と inet_pton() 関数は、 xns5.2 に適合しています。 inet_pton() 関数は、1 個、2 個もしくは 3 個のドット形式のアドレスには 対応していないことに注意してください。 アドレスは 4 個に分けて指定しなければなりません。 これは inet_aton() 関数が受け取ることのできる入力セットよりもせまいものです。

歴史
これらの関数は 4.2BSD で登場しました。

バグ
INADDR_NONE (0xffffffff) 値は有効なブロードキャストアドレスですが、 inet_addr() はこの値を返す時に失敗を示してしまいます。 新しい inet_aton() 関数では、この問題は解決されています。 ホストバイトオーダ対ネットワークバイトオーダの問題は混乱しがちです。 inet_ntoa() が返す文字列は静的メモリ領域に収められます。

inet_addr は struct in_addr を返す必要があります。