名 前
inet_pton − IPv4/IPv6 ア ド レ ス を テ キ ス ト 形 式 か ら バ イ ナ リ 形 式 に 変 換 す る
書 式
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
説 明
こ の 関 数 は 文 字 列 src を 、 ア ド レ ス フ ァ ミ リ ー af の ネ ッ ト ワ ー ク ア ド レ ス 構 造 体 に 変 換 し 、 dst に コ ピ ー す る 。 af 引 き 数 は AF_INET か AF_INET6 の ど ち ら か で な け れ ば な ら な い 。 現 在 サ ポ ー ト さ れ て い る ア ド レ ス フ ァ ミ リ ー は 以 下 の 通 り で あ る 。
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 を 設 定 す る 。
準 拠
POSIX.1−2001.
注 意
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 プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。