名 前
inet_net_pton, inet_net_ntop − イ ン タ ー ネ ッ ト の ネ ッ ト ワ ー ク 番 号 の 変 換
書 式
#include <arpa/inet.h>
int
inet_net_pton(int af, const char
*pres,
void *netp, size_t
nsize);
char
*inet_net_ntop(int af, const void
*netp, int bits,
char *pres, size_t
psize);
−lresolv で リ ン ク す る 。
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
inet_net_pton(), inet_net_ntop():
glibc 2.20 以 降 :
_DEFAULT_SOURCE
glibc 2.20 よ り 前 :
_BSD_SOURCE || _SVID_SOURCE
説 明
こ れ ら の 関 数 は (印 字 可 能 な ) 表 記 形 式 と ネ ッ ト ワ ー ク 形 式 (バ イ ナ リ ー 形 式 ) 間 の 変 換 を 行 う 。 ど ち ら の 関 数 で も af は 変 換 を 行 う ア ド レ ス フ ァ ミ リ ー を 指 定 す る 。 サ ポ ー ト さ れ て い る 値 は AF_INET だ け で あ る 。
inet_net_pton()
inet_net_pton() 関 数 は 、
表 記 形 式 で イ
ン タ ー ネ ッ ト
ネ ッ ト ワ ー ク
番 号 を 格 納 し
た NULL 終 端 さ れ た
文 字 列 で あ る
pres を ネ ッ ト ワ
ー ク 形 式 に 変
換 す る 。 ネ ッ
ト ワ ー ク バ イ
ト オ ー ダ ー の
変 換 結 果 は netp
が 指 す バ ッ フ
ァ ー に 格 納 さ
れ る (netp 引 き 数
は 通 常 in_addr 構 造
体 を 指 し て い
る )。 nsize 引 き 数
は netp で 利 用 可
能 な バ イ ト 数
を 示 す 。 成 功
す る と inet_net_pton() は
netp に 格 納 し た
結 果 の ネ ッ ト
ワ ー ク 番 号 フ
ィ ー ル ド の ビ
ッ ト 数 を 返 す
。 入 力 の 表 記
形 式 と 返 り 値
に 関 す る 議 論
は 「 注 意 」 の
節 を 参 照 。 注
意 : netp が 指 す
バ ッ フ ァ ー は
inet_net_pton() の 呼 び 出
し 前 に 0 で 埋 め
る べ き で あ る
。 呼 び 出 し で
は ネ ッ ト ワ ー
ク 番 号 で 必 要
な バ イ ト だ け
が 書 き 込 ま れ
、 そ の バ イ ト
数 は 完 全 な ネ
ッ ト ワ ー ク ア
ド レ ス の バ イ
ト 数 よ り も 少
な い こ と も あ
る 。
inet_net_ntop()
inet_net_ntop() 関 数 は netp
が 指 す バ ッ フ
ァ ー の ネ ッ ト
ワ ー ク 番 号 を
表 記 形 式 に 変
換 す る 。 *netp は
ネ ッ ト ワ ー ク
バ イ ト オ ー ダ
ー で の 値 と し
て 解 釈 さ れ る
。 bits 引 き 数 は
*netp の ネ ッ ト ワ
ー ク 番 号 の ビ
ッ ト 数 を 指 定
す る 。
NULL 終 端 さ れ た 表 記 形 式 の 文 字 列 は pres が 指 す バ ッ フ ァ ー に 格 納 さ れ る 。 psize 引 き 数 は pres で 利 用 可 能 な バ イ ト 数 を 指 定 す る 。 表 記 形 式 は CIDR 形 式 、 つ ま り 、 ネ ッ ト ワ ー ク ア ド レ ス を 表 す ド ッ ト 区 切 り の 10 進 数 に 、 ス ラ ッ シ ュ と ネ ッ ト ワ ー ク 番 号 の ビ ッ ト サ イ ズ が 続 く 形 式 で あ る 。
返 り 値
成 功 す る と inet_net_pton() は ネ ッ ト ワ ー ク 番 号 の ビ ッ ト 数 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。 成 功 す る と inet_net_ntop() は pres を 返 す 。 エ ラ ー の 場 合 、 NULL を 返 し 、 errno に エ ラ ー を 示 す 値 が セ ッ ト さ れ る 。
エ ラ ー
EAFNOSUPPORT
af に AF_INET 以 外 の 値 が 指 定 さ れ た 。
EMSGSIZE 出 力 バ ッ フ ァ ー の サ イ ズ が 十 分 で な か っ た 。
ENOENT |
(inet_net_pton() の 場 合 ) pres が 正 し い 表 記 形 式 で は な か っ た 。 |
準 拠
関 数 inet_net_pton() と inet_net_ntop() は 非 標 準 だ が 、 多 く の シ ス テ ム で 利 用 可 能 で あ る 。
注 意
inet_net_pton() の 入 力 の 表 記 形 式 ネ ッ ト ワ ー ク 番 号 は 、 16 進 数 値 、 ま た は ド ッ ト 区 切 り の 10 進 数 表 記 で 指 定 で き る 。 先 頭 に "0x" か "0X" が あ る 場 合 16 進 数 値 と な る 。 16 進 数 は ネ ッ ト ワ ー ク バ イ ト オ ー ダ ー の 左 か ら 右 へ 半 オ ク テ ッ ト (4 ビ ッ ト ) ず つ 順 番 に 埋 め ら れ る 。 ド ッ ト 区 切 り の 10 進 数 表 記 で は 、 最 大 4 つ の オ ク テ ッ ト を ド ッ ト 区 切 り の 10 進 数 で 指 定 す る 。 し た が っ て 、 以 下 の 形 式 を 指 定 で き る 。
a.b.c.d
a.b.c
a.b
a 各 部 分 は 0 か ら
255 の 範 囲 の 数 字
で 、 ネ ッ ト ワ
ー ク 番 号 の 各
バ イ ト に 左 か
ら 右 に ネ ッ ト
ワ ー ク バ イ ト
オ ー ダ ー (ビ ッ
グ エ ン デ ィ ア
ン ) で 順 番 に 埋
め ら れ る 。 省
略 さ れ た 部 分
が あ れ ば 、 対
応 す る ネ ッ ト
ワ ー ク 番 号 の
バ イ ト は 0 と な
る 。
16 進 数 と ド ッ ト 区 切 り の 10 進 数 形 式 の ど ち ら の 場 合 も 、 ネ ッ ト ワ ー ク 番 号 の 後 ろ に ス ラ ッ シ ュ と 0 か ら 32 の 範 囲 の 数 字 を オ プ シ ョ ン で 付 け る こ と が で き る 。 こ の 数 字 は ネ ッ ト ワ ー ク 番 号 の ビ ッ ト 単 位 の サ イ ズ を 示 す も の で あ る 。
inet_net_pton()
の 返 り 値
inet_net_pton() の 返 り 値
は ネ ッ ト ワ ー
ク 番 号 フ ィ ー
ル ド の ビ ッ ト
数 で あ る 。 入
力 の 表 記 形 式
の 文 字 列 が ス
ラ ッ シ ュ と サ
イ ズ の 明 示 的
な 値 で 終 わ っ
て い る 場 合 、
指 定 さ れ た サ
イ ズ が inet_net_pton() の
返 り 値 と な る
。 そ う で な い
場 合 は 、 返 り
値 bits が 以 下 の
よ う に し て 推
測 さ れ る 。
* ネ ッ ト ワ ー ク 番 号 の 最 上 位 バ イ ト が |
240 以 上 の 場 合 、 bits は 32 と な |
る 。
* そ れ 以 外 で 、 ネ ッ ト ワ ー ク 番 号 の 最 上 位 バ イ ト が |
224 以 上 の 場 合 、 bits |
は 4 と な る 。
* そ れ 以 外 で 、 ネ ッ ト ワ ー ク 番 号 の 最 上 位 バ イ ト が |
192 以 上 の 場 合 、 bits |
は 24 と な る 。
* そ れ 以 外 で 、 ネ ッ ト ワ ー ク 番 号 の 最 上 位 バ イ ト が |
128 以 上 の 場 合 、 bits |
は 16 と な る 。
* そ れ 以 外 の 場 合 、 |
bits は 8 と な る 。 |
上 記 の 手 順 か ら 得 ら れ る bits の 値 が 8 以 上 だ が 、 ネ ッ ト ワ ー ク 番 号 で 指 定 さ れ た オ ク テ ッ ト 数 が bits/8 よ り 大 き い 場 合 、 bits に は 実 際 に 指 定 さ れ た オ ク テ ッ ト 数 を 8 倍 し た 値 が 設 定 さ れ る 。
例
以 下 の プ ロ グ ラ ム は inet_net_pton() と inet_net_ntop() の 使 用 例 を 示 す も の で あ る 。 inet_net_pton() を 使 っ て 、 コ マ ン ド ラ イ ン の 最 初 の 引 き 数 で 渡 さ れ た 表 記 形 式 の ネ ッ ト ワ ー ク ア ド レ ス を バ イ ナ リ ー 形 式 に 変 換 し 、 inet_net_pton() の 返 り 値 を 出 力 す る 。 そ れ か ら inet_net_ntop() を 使 っ て バ イ ナ リ ー 形 式 を 表 記 形 式 に 再 度 戻 し て 、 結 果 の 文 字 列 を 出 力 す る 。
inet_net_pton() が netp 引 き 数 の す べ て の バ イ ト に 書 き 込 む わ け で は な い こ と を 示 す た め 、 プ ロ グ ラ ム に は オ プ シ ョ ン で 2 番 目 の コ マ ン ド ラ イ ン 引 き 数 を 指 定 す る こ と が で き 、 そ の 引 き 数 の 数 字 を 使 っ て inet_net_pton() を 呼 び 出 す 前 に バ ッ フ ァ ー を 初 期 化 す る 。 出 力 の 最 終 行 と し て 、 ユ ー ザ ー が ど の バ イ ト が inet_net_pton() に よ っ て 変 更 さ れ な か っ た か を 確 認 で き る よ う に 、 プ ロ グ ラ ム は inet_net_pton() が 返 し た バ ッ フ ァ ー の 全 バ イ ト を 表 示 す る 。 こ の 実 行 例 で は 、 inet_net_pton() が 推 測 し た ネ ッ ト ワ ー ク 番 号 の ビ ッ ト 数 を 表 示 す る 。
$ ./a.out
193.168
inet_net_pton() returned: 24
inet_net_ntop() yielded: 193.168.0/24
Raw address: c1a80000
inet_net_pton() が 結 果 の バ ッ フ ァ ー の 未 使 用 バ イ ト を 0 埋 め し な い こ と を 確 認 す る 。
$ ./a.out
193.168 0xffffffff
inet_net_pton() returned: 24
inet_net_ntop() yielded: 193.168.0/24
Raw address: c1a800ff 表 記 形 式
の 文 字 列 で 渡
さ れ た バ イ ト
数 が 推 測 し た
値 よ り 大 き い
場 合 、 inet_net_pton() が
推 測 す る ネ ッ
ト ワ ー ク 番 号
の サ イ ズ を 広
げ る こ と を 確
認 す る 。
$ ./a.out
193.168.1.128
inet_net_pton() returned: 32
inet_net_ntop() yielded: 193.168.1.128/32
Raw address: c1a80180 ネ ッ ト ワ
ー ク 番 号 の サ
イ ズ が 明 示 的
に 指 定 す る と
、 推 測 さ れ る
ネ ッ ト ワ ー ク
番 号 の サ イ ズ
が 上 書 き さ れ
る (た だ し 、 明
示 的 に 指 定 さ
れ た 残 り の バ
イ ト は inet_net_pton() で
使 用 さ れ 、 結
果 の バ ッ フ ァ
ー に 書 き 込 ま
れ る )。
$ ./a.out
193.168.1.128/24
inet_net_pton() returned: 24
inet_net_ntop() yielded: 193.168.1/24
Raw address: c1a80180 プ ロ グ ラ
ム の ソ ー ス
/* "−lresolv" で リ ン ク す る */
#include
<arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#define
errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ }
while (0)
int
main(int argc, char *argv[])
{
char buf[100];
struct in_addr addr;
int bits;
if (argc <
2) {
fprintf(stderr,
"Usage: %s presentation−form
[addr−init−value]\n",
argv[0]);
exit(EXIT_FAILURE); }
/* argv[2]
(数 値 ) が 指 定 さ
れ る と 、 そ の
数 字 を 使 っ て
inet_net_pton() に 渡 す 出 力
バ ッ フ ァ ー を
初 期 化 す る 。
こ れ に よ り
inet_net_pton() が ネ ッ ト ワ
ー ク 番 号 に 必
要 な バ イ ト だ
け を 書 き 込 む
こ と を 確 認 で
き る よ う に す
る 。
argv[2] が 指 定 さ れ
な か っ た 場 合
、 バ ッ フ ァ ー
は 0 で 初 期 化 す
る
(こ れ が 推 奨 さ
れ る 方 法 で あ
る )。 */
addr.s_addr = (argc > 2) ? strtod(argv[2], NULL) : 0;
/* argv[1] の 表 記 形 式 の ネ ッ ト ワ ー ク 番 号 を バ イ ナ リ ー 形 式 に 変 換 す る */
bits =
inet_net_pton(AF_INET, argv[1], &addr, sizeof(addr));
if (bits == −1)
errExit("inet_net_ntop");
printf("inet_net_pton() returned: %d\n", bits);
/*
inet_net_pton() が 返 し た 'bits'
を 使 っ て 、 バ
イ ナ リ ー 形 式
を 表 記 形 式 に
変 換 す る
*/
if
(inet_net_ntop(AF_INET, &addr, bits, buf, sizeof(buf))
== NULL)
errExit("inet_net_ntop");
printf("inet_net_ntop() yielded: %s\n", buf);
/* 'addr'
を 名 前 の 形 で
(ネ ッ ト ワ ー ク
バ イ ト オ ー ダ
ー で ) 表 示 す る
。 こ れ に よ り
inet_net_ntop() が 表 示 し な
い バ イ ト を 確
認 で き る 。 こ
れ ら の バ イ ト
の 一 部 は
inet_net_ntop() で は 変 更 さ
れ な い 場 合 が
あ り 、 そ の 場
合
argv[2] で 指 定 さ れ
た 初 期 値 の ま
ま に な る 。 */
printf("Raw address: %x\n", htonl(addr.s_addr));
exit(EXIT_SUCCESS); }
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。