INET_PTON
Section: Linux Programmer's Manual (3)
Updated: 2020-06-09
Index
JM Home Page
roff page
 
名前
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/ に書かれている。
 Index
- 名前
 - 
 - 書式
 - 
 - 説明
 - 
 - 返り値
 - 
 - 属性
 - 
 - 準拠
 - 
 - 注意
 - 
 - バグ
 - 
 - 例
 - 
- プログラムのソース
 - 
 
 - 関連項目
 - 
 - この文書について
 - 
 
This document was created by
man2html,
using the manual pages.
Time: 16:46:41 GMT, November 24, 2023