#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(in_addr_t net, in_addr_t 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():
Since glibc 2.19: _DEFAULT_SOURCE In glibc up to and including 2.19: _BSD_SOURCE || _BSD_SOURCE
上記の全ての形式で、ドット区切りのアドレスの各要素は、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;
};
Interface | Attribute | Value |
inet_aton(),
inet_addr(),
inet_network(), inet_ntoa() | Thread safety | MT-Safe locale |
inet_makeaddr(),
inet_lnaof(),
inet_netof() | Thread safety | MT-Safe |
inet_aton() is not specified in POSIX.1, but is available on most systems.
inet_lnaof(), inet_netof(), inet_makeaddr() は過去の名残であり、渡されたアドレスが クラスフルネットワークアドレス (classful network addresses) であると仮定して処理を行う。 クラスフルネットワークアドレスでは、以下にあるように、 IPv4 ネットワークアドレスをバイト境界でネットワーク部とホスト部に分割する。
クラスフルネットワークアドレスは現在では廃止され、 クラスレスドメイン間ルーチン (CIDR) に取って代わられた。 CIDR では、アドレスを任意のビット境界 (バイト境界ではない) で ネットワーク部とホスト部に分割する。
$ ./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
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);
}