書式
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
in_addr_t inet_network(const char *cp);
char *inet_ntoa(struct in_addr in);
struct in_addr inet_makeaddr(int net, int host);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
inet_aton(), inet_ntoa(): _BSD_SOURCE || _SVID_SOURCE
説明
inet_aton() は、インターネットホストのアドレス cp を、 IPv4 の数値とドットによる表記から (ネットワークバイトオーダの) バイナリ値へ 変換し、変換結果を inp が指している構造体に格納する。 アドレスが有効な場合 0 以外を返し、そうでない場合は 0 を返す。 cp で渡すアドレスとして、以下の形式を用いることができる。- a.b.c.d
- 4 つの数字のそれぞれはアドレスの各バイトを示す。 これらのバイトは左から右の順序でバイナリアドレスに割り当てられる。
- a.b.c
- a と b はバイナリアドレスの最初の 2 バイトを示す。 c は 16 ビット値と解釈され、バイナリアドレスの右側の 2 バイトを表す。 この表記は、(過去のものとなった) クラス B ネットワークアドレスを 指定するのに適している。
- a.b
- a はバイナリアドレスの最初のバイトを示す。 b は 24 ビット値と解釈され、バイナリアドレスの右側の 3 バイトを表す。 この表記は、(過去のものとなった) クラス A ネットワークアドレスを 指定するのに適している。
- a
- 値 a は 32 ビット値と解釈され、バイトの再配置は行われず、 そのままバイナリアドレスとして格納される。
上記の全ての形式で、ドット区切りのアドレスの各要素は、10 進数、 8 進数 (先頭に 0 を付ける)、 16 進数 (先頭に 0X を付ける) で指定できる。 これらの形式のアドレスをまとめて IPv4 の数値とドットによる表記 (IPv4 numbers-and-dots notation) と呼ぶ。 また、10 進数 4 つだけを使った形式を IPv4 のドット区切りの 10 進数表記 (IPv4 dotted-decimal notation) と呼ぶ (IPv4 のドット区切り 4 分割表記 (IPv4 dotted-decimal notation) と呼ぶこともある)。
inet_aton() は渡された文字列が正常に解釈できた場合 1 を返し、 文字列が不正な場合 0 を返す (エラーの場合に errno はセットされない)。
inet_addr() 関数は、インターネットホストのアドレス cp を、 IPv4 の数値とドットによる表記からネットワークバイトオーダでの バイナリ値へ変換して返す。 入力が不正な場合、 INADDR_NONE (普通は -1) を返す。 -1 は有効なアドレス (255.255.255.255) なので、この関数を使うと 問題になるかもしれない。 この関数を使うのは避け、代わりに inet_aton(), inet_pton(3), getaddrinfo(3) を使うのがよい。 これらの関数の方が、エラーの通知がよりきれいな方法で行われる。
inet_network() 関数は、 IPv4 の数値とドットによる表記の文字列 cp を、 インターネットアドレスとしての使用に適した ホストバイトオーダの数値に変換する。 成功すると、変換されたアドレスを返す。 入力が不正な場合は -1 を返す。
inet_ntoa() 関数は、ネットワークバイトオーダで渡されたインターネットホストアドレス in を、 IPv4 のドット区切りの 10 進数表記の文字列に変換する。 文字列は静的に割当てられたバッファに格納されて返されるので、 この後でこの関数を再度呼び出すと文字列は上書きされる。
inet_lnaof() 関数は、インターネットアドレス in のローカルネットワーク部分を返す。 この返り値はホストバイトオーダである。
inet_netof() 関数は、インターネットアドレス in のネットワーク部分を返す。 この返り値はホストバイトオーダである。
inet_makeaddr() 関数は inet_netof() と inet_lnaof() の逆の機能を持つ。 ネットワーク番号 net と、ローカルアドレス host を 組み合わせて生成した、インターネットホストアドレスを ネットワークバイトオーダで返す。 host, net はともにホストバイトオーダである。
inet_ntoa(), inet_makeaddr(), inet_lnaof(), inet_netof() で使用する構造体 in_addr は <netinet/in.h> で次のように定義されている:
typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; };
準拠
4.3BSD. inet_addr(), inet_ntoa() は POSIX.1-2001 で規定されている。 inet_aton() は POSIX.1-2001 で規定されていないが、ほとんどのシステムで利用可能である。注意
i386 ではホストバイトオーダは Least Significant Byte (LSB) first (リトルエンディアン) だが、 インターネットで使われるネットワークバイトオーダは Most Significant Byte (MSB) first (ビッグエンディアン) である点に注意すること。inet_lnaof(), inet_netof(), inet_makeaddr() は過去の名残であり、渡されたアドレスが クラスフル・ネットワークアドレス (classful network addresses) であると仮定して処理を行う。 クラスフル・ネットワークアドレスでは、以下にあるように、 IPv4 ネットワークアドレスをバイト境界でネットワーク部とホスト部に分割する。
- Class A
- (ネットワークバイトオーダの) アドレスの最上位ビットが 0 の場合、 このアドレス種別となる。このアドレス種別では、 最上位バイトがネットワークアドレスを表し、 残りの 3 バイトがホストアドレスを表す。
- Class B
- (ネットワークバイトオーダの) アドレスの上位側 2 ビットがバイナリ値で 10 の場合、このアドレス種別となる。このアドレス種別では、 上位 2 バイトがネットワークアドレスを表し、 残りの 2 バイトがホストアドレスを表す。
- Class C
- (ネットワークバイトオーダの) アドレスの上位側 3 ビットがバイナリ値で 110 の場合、このアドレス種別となる。このアドレス種別では、 上位 3 バイトがネットワークアドレスを表し、 残りの 1 バイトがホストアドレスを表す。
クラスフル・ネットワークアドレスは現在では廃止され、 クラスレス・ドメイン間ルーチン (CIDR) に取って代わられた。 CIDR では、アドレスを任意のビット境界 (バイト境界ではない) で ネットワーク部とホスト部に分割する。
例
以下は inet_aton() と inet_ntoa() の使用例である。このように実行する。$ ./a.out 226.000.000.037 # Last byte is in octal 226.0.0.31 $ ./a.out 0x7f.1 # First byte is in hex 127.0.0.1
プログラムのソース
#define _BSD_SOURCE #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { struct in_addr addr; if (argc != 2) { fprintf(stderr, "%s <dotted-address>\n", argv[0]); exit(EXIT_FAILURE); } if (inet_aton(argv[1], &addr) == 0) { fprintf(stderr, "Invalid address\n"); exit(EXIT_FAILURE); } printf("%s\n", inet_ntoa(addr)); exit(EXIT_SUCCESS); }
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。