INET(3) | Linux Programmer's Manual | INET(3) |
inet_aton, inet_addr, inet_network, inet_ntoa, inet_makeaddr, inet_lnaof, inet_netof - インターネットアドレス操作ルーチン
#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);
inet_aton(), inet_ntoa():
Since glibc 2.19:
_DEFAULT_SOURCE
In glibc up to and including 2.19:
_BSD_SOURCE || _BSD_SOURCE
inet_aton() は、インターネットホストのアドレス cp を、 IPv4 の数値とドットによる表記から (ネットワークバイトオーダの) バイナリ値へ 変換し、変換結果を inp が指している構造体に格納する。 アドレスが有効な場合 0 以外を返し、そうでない場合は 0 を返す。 cp で渡すアドレスとして、以下の形式を用いることができる。
上記の全ての形式で、ドット区切りのアドレスの各要素は、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; };
この節で使用されている用語の説明は attributes(7) を参照のこと。
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_addr(), inet_ntoa(): POSIX.1-2001, POSIX.1-2008, 4.3BSD.
inet_aton() is not specified in POSIX.1, but is available on most systems.
x86 アーキテクチャーではホストバイトオーダは Least Significant Byte (LSB) first (リトルエンディアン) だが、 インターネットで使われるネットワークバイトオーダは Most Significant Byte (MSB) first (ビッグエンディアン) である点に注意すること。
inet_lnaof(), inet_netof(), inet_makeaddr() は過去の名残であり、渡されたアドレスが クラスフルネットワークアドレス (classful network addresses) であると仮定して処理を行う。 クラスフルネットワークアドレスでは、以下にあるように、 IPv4 ネットワークアドレスをバイト境界でネットワーク部とホスト部に分割する。
クラスフルネットワークアドレスは現在では廃止され、 クラスレスドメイン間ルーチン (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); }
byteorder(3), getaddrinfo(3), gethostbyname(3), getnameinfo(3), getnetent(3), inet_net_pton(3), inet_ntop(3), inet_pton(3), hosts(5), networks(5)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-12-21 | GNU |