INET_PTON
Section: Linux Programmer's Manual (3)
Updated: 2008-06-18
Index
JM Home Page
roff page
名前
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)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- 準拠
-
- 注意
-
- バグ
-
- 例
-
- プログラムのソース
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 03:26:45 GMT, April 25, 2010