plucky (3) inet_pton.3.gz

Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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 を返し、 errnoEAFNOSUPPORT を設定する。

属性

       この節で使用されている用語の説明は attributes(7) を参照のこと。

       ┌────────────┬───────────────┬────────────────┐
       │InterfaceAttributeValue          │
       ├────────────┼───────────────┼────────────────┤
       │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/ に書かれている。