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
で渡すアドレスとして、以下の形式を用いることができる。
- 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;
};
この節で使用されている用語の説明は
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
ネットワークアドレスをバイト境界でネットワーク部とホスト部に分割する。
- 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);
}
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/
に書かれている。