inet_pton - IPv4/IPv6
アドレスをテキスト形式からバイナリ形式に変換する
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
This function converts the character string
src into a network address
structure in the
af address family, then copies the network address
structure to
dst. The
af argument must be either
AF_INET
or
AF_INET6.
dst is written in network byte order.
現在サポートされているアドレスファミリーは以下の通りである。
- AF_INET
-
src
はドット区切りの 10
進数形式 " ddd.ddd.ddd.ddd"
の IPv4
ネットワークアドレス文字列へのポインターである。
ddd は 0 から 255
までの範囲の最大 3
桁の 10 進数である。
このアドレスは struct
in_addr に変換されて dst
にコピーされる。
dst の長さは sizeof(struct in_addr)
(4) バイト (32ビット)
でなければならない。
- AF_INET6
-
src は IPv6
ネットワークアドレスが格納された文字列へのポインターである。
このアドレスは struct
in6_addr に変換されて dst
にコピーされる。
dst の長さは sizeof(struct in6_addr)
(16) バイト (128 ビット)
でなければならない。
以下の 3
つのルールにしたがった形式が
IPv6
アドレスとして入力できる。
- 1.
- 推奨形式は
x:x:x:x:x:x:x:x
である。この形式は 8
個の 16
進数から構成され、
各々の 16 進数は 16
ビット値を表す ( x
は最大 4 桁の 16
進数である)。
- 2.
- 推奨形式の中の連続する
0 の列は ::
に短縮できる。アドレス中で使用できる
:: は 1
個だけである。
例えば、ループバックアドレス
0:0:0:0:0:0:0:1 は ::1
と短縮できる。
全ビットが 0
で構成されるワイルドカードアドレスは
:: と記載できる。
- 3.
- IPv4
をマッピングした IPv6
アドレスを表記するには別の形式が便利である。
この別の形式は
x:x:x:x:x:x:d.d.d.d
と書くことができる。
最初の 6 個の x
はアドレスを 16
ビット単位に区切ったときの上位側
6 個分 (つまり 96
ビット分) を定義する
16 進数であり、 d
の部分はアドレスの下位
32
ビットをドット区切りの
10
進数表記で表したものである。
::FFFF:204.152.189.116
はこの形式の例である。
- IPv6
アドレスの表現方法の詳細については
RFC 2373 を参照のこと。
成功する
(ネットワークアドレスが正常に変換される)
と、
inet_pton() は 1
を返す。
src
が指定されたアドレスファミリーに対する
正しいネットワークアドレス表記でない場合には、
0 を返す。
af
がサポートされているアドレスファミリーでない場合には、
-1 を返し、
errno に
EAFNOSUPPORT
を設定する。
この節で使用されている用語の説明は
attributes(7) を参照のこと。
Interface |
Attribute |
Value |
inet_pton() |
Thread safety |
MT-Safe locale |
POSIX.1-2001, POSIX.1-2008.
inet_aton(3) や
inet_addr(3)
と異なり、
inet_pton() は IPv6
アドレスに対応している。
一方で、
inet_pton()
が受け付ける IPv4
アドレスはドット区切りの
10
進数表記だけである。
これに対し、
inet_aton(3) や
inet_addr(3)
ではもっと一般的なドット区切りの数字表記
(16 進数や 8
進数の形式や、 4
バイト全てを明示的に書かなくてもよい形式)
が使用できる。
ドット区切りの数字表記で
IPv6 アドレスと IPv4
アドレスの両方を扱える
インターフェイスについては、
getaddrinfo(3) を参照のこと。
AF_INET6 は IPv4
アドレスを認識しない。
代わりに IPv4
アドレスをマッピングした
IPv6 アドレスを
src
に与えなければならない。
以下のプログラムは
inet_pton() と
inet_ntop(3)
の使用例を示すものである。
実行すると以下のようになる。
$ ./a.out i6 0:0:0:0:0:0:0:0
::
$ ./a.out i6 1:0:0:0:0:0:0:8
1::8
$ ./a.out i6 0:0:0:0:0:FFFF:204.152.189.116
::ffff:204.152.189.116
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{
unsigned char buf[sizeof(struct in6_addr)];
int domain, s;
char str[INET6_ADDRSTRLEN];
if (argc != 3) {
fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]);
exit(EXIT_FAILURE);
}
domain = (strcmp(argv[1], "i4") == 0) ? AF_INET :
(strcmp(argv[1], "i6") == 0) ? AF_INET6 : atoi(argv[1]);
s = inet_pton(domain, argv[2], buf);
if (s <= 0) {
if (s == 0)
fprintf(stderr, "Not in presentation format");
else
perror("inet_pton");
exit(EXIT_FAILURE);
}
if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) {
perror("inet_ntop");
exit(EXIT_FAILURE);
}
printf("%s\n", str);
exit(EXIT_SUCCESS);
}
getaddrinfo(3),
inet(3),
inet_ntop(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。