HP-UX IPv6 ポーティングガイド

HP-UX IPv6 ポーテ ィ ン グ ガ イ ド
HP-UX 11i v3
Manufacturing Part Number : B2355-91070
2007 年 2 月
Printed in the U.S.A.
© Copyright 2007 Hewlett-Packard Company L.P. All rights reserved.
ご注意
1. 本書に記載 し た内容は、 予告な し に変更す る こ と があ り ます。
2. 本書は内容について細心の注意を も っ て作成いた し ま し たが、 万一ご不審な点や誤 り 、 記載
も れな ど、 お気付 き の点がご ざい ま し た ら 当社ま でお知 ら せ く だ さ い。
3. 当社は、 お客様の誤っ た操作に起因す る 損害については、 責任を負いかねますので ご了承 く
だ さ い。
4. 当社では、 本書に関 し て特殊目的に対す る 適合性、 市場性な ど については、 一切の保証をい
た し かねます。 ま た、 備品、 パフ ォーマ ン ス等に関連 し た損傷について も 保証いた し かねま
す。
5. 当社提供外の ソ フ ト ウ ェ アの使用や信頼性についての責任は負いかねます。
6. 本書の内容の一部ま たは全部を、 無断で コ ピー し た り 、 他のプ ロ グ ラ ム言語に翻訳す る こ と
は法律で禁止 さ れてい ます。
7. 本書お よ び提供 し た CD 等の媒体は本製品用だけにお使い く だ さ い。 プ ロ グ ラ ム を コ ピーす
る 場合はバ ッ ク ア ッ プ用だけに し て く だ さ い。 プ ロ グ ラ ム を その ま ま の形で、 あ る いは変更
を加え て第三者に販売す る こ と は固 く 禁 じ ら れてい ます。
U.S. Government License
Confidential computer software. Valid license from HP required for possession, use or copying.
Consistent with FAR 12.211 and 12.212, Commercial Computer Software, Computer Software
Documentation, and Technical Data for Commercial Items are licensed to the U.S.
Government under vendor's standard commercial license.
著作権
Copyright © 2007 Hewlett-Packard Development Company L.P.
本書には著作権に よ っ て保護 さ れてい る 内容が含ま れてい ます。 本書の内容の一部ま たは全部を
著作者の許諾な し に複製、 改変、 お よ び翻訳する こ と は、 著作権法下での許可事項を除 き、 禁止
さ れてい ます。
商標
UNIX® は、 The Open Group の登録商標です。
Intel® お よ び Itanium® は、 Intel Corporation の登録商標です。
Microsoft®、 Windows® お よ び Windows NT® は、 米国におけ る Microsoft Corporation の登録
商標です。
2
納入後の保証について
•
保証の期間は、 ご購入時に当社 よ り お出 し し た見積書に記載 さ れた期間 と し ます。 保証サー
ビ ス は、 当社の定め る 休日を除 く 月曜日か ら 金曜日ま での、 午前 8 時 45 分か ら 午後 5 時 30
分の範囲で無料で行い ます。 当社で定めたシ ス テ ム製品については出張修理を行い、 その他
の製品については当社にご返却いただいた上での引取 り 修理 と な り ます。 当社が定め る 地域
以外におけ る 出張修理対象製品の修理は、 保証期間中において も 技術者派遣費が有料 と な り
ます。
•
ソ フ ト ウ ェ ア製品の保証は上記にかかわ ら ず、 下記に定め る 範囲 と さ せていただ き ます。
— ソ フ ト ウ ェ ア製品お よ びマニ ュ アルは当社が供給 し た媒体物の破損、 資料の落丁お よ び
プ ロ グ ラ ム イ ン ス ト ラ ク シ ョ ン が実行で き ない場合のみ保証いた し ます。
— バグお よ び前記以外の問題の解決は、 別に締結す る ソ フ ト ウ ェ アサポー ト 契約に基づい
て実施 さ れ ます。
•
次の よ う な場合には、 保証期間内で も 修理が有料 と な り ます。
— 取扱説明書等に記載 さ れてい る保証対象外部品の故障の場合。
— 当社が供給 し ていない ソ フ ト ウ ェ ア、 ハー ド ウ ェ ア、 ま たは補用品の使用に よ る 故障の
場合。
— お客様の不適当ま たは不十分な保守に よ る 故障の場合。
— 当社が認めていない改造、 酷使、 誤使用ま たは誤操作に よ る 故障の場合。
— 納入後の移設が不適切であ っ たための故障ま たは損傷の場合。
— 指定外の電源 ( 電圧、 周波数 ) 使用ま たは電源の異常に よ る 故障の場合。
— 当社が定めた設置場所基準に適合 し ない場所での使用、 お よ び設置場所の不適当な保守
に よ る 故障の場合。
— 火災、 地震、 風水害、 落雷、 騒動、 暴動、 戦争行為、 放射能汚染、 お よ びその他天災地
変等の不可抗力的事故に よ る 故障の場合。
•
当社で取 り 扱 う 製品は、 ご需要先の特定目的に関す る 整合性の保証はいた し かねます。 ま
た、 そ こ か ら 生 じ る 直接的、 間接的損害に対 し て も 責任を負いかねます。
•
当社で取 り 扱 う 製品を組み込みあ る いは転売 さ れ る 場合は、 最終需要先におけ る 直接的、 間
接的損害に対 し ては責任を負いかねます。
•
製品の保守、 修理用部品の供給期間は、 その製品の製造中止後 5 年間 と さ せていただ き ます。
本製品の修理については取扱説明書に記載 さ れてい る 最寄の事業所へお問い合わせ く だ さ い。
3
4
目次
1. は じ めに
IPv6 に移行す る理由 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
対象読者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
既存の IPv4 アプ リ ケーシ ョ ンは変更す る 必要があ り ますか ? . . . . . . . . . . . . . . . . . . . .
IPv6 を実装す る には、 IPv4 か ら 完全に移行す る 必要があ り ますか ? . . . . . . . . . . . . . .
用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
一般的な IP 用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
14
14
15
16
16
16
2. IPv6 ア ド レ ス
IPv6 ア ド レ ス の種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 ア ド レ ス の ス コ ープ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv4 か ら IPv6 への移行時のア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv4 射影ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv4 ア ド レ ス と IPv6 ア ド レ ス の比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
先行す る ゼ ロ は省略で き ます . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
0 し か含ま ない連続フ ィ ール ド は省略で き ます . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv4 射影 IPv6 ア ド レ ス は、 ド ッ ト 区切 り 10 進表記で IPv4 ア ド レ ス を
表示で き ます . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 ア ド レ ス の種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ユニ キ ャ ス ト ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 ループバ ッ ク ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
リ ン ク ロ ーカル ユニ キ ャ ス ト ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 マルチキ ャ ス ト ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
既知のマルチキ ャ ス ト ア ド レ ス ( 一部 ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 ワ イ ル ド カー ド ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 ループバ ッ ク ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
18
18
18
20
20
20
21
22
22
22
23
23
24
24
25
3. デー タ 構造体の相違点
IP ア ド レ ス構造体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv4 構造体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 構造体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3BSD ベース の HP-UX 用 ソ ケ ッ ト ア ド レ ス構造体 . . . . . . . . . . . . . . . . . . . . . . . . . .
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv4 構造体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 構造体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
汎用 ソ ケ ッ ト ア ド レ ス構造体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
28
28
28
29
29
29
29
30
30
5
目次
4. IPv4 から IPv6 へのア プ リ ケーシ ョ ンの移行
IPv4/IPv6 デ ュ アル ス タ ッ ク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5. IPv4 お よび IPv6 の関数呼び出 し の設定概要
AF_INET ソ ケ ッ ト を使用 し た IPv4 UDP の通信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 UDP 通信での送信 . . . . . . . . . . . . . . . . . . . . . . .
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 通信での受信 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 通信での AF_INET6 ソ ケ ッ ト の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
35
37
39
6. 名前を ア ド レ スに変換する関数呼び出 し
getaddrinfo(3N) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パラ メータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
hints が指す addrinfo デー タ 構造体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
getipnodebyname(3N) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
42
42
44
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
パ ラ メ ー タ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
7. IP ア ド レ ス を名前に変換する関数呼び出 し
getnameinfo(3N) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パラ メータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
getipnodebyaddr(3N) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
48
48
50
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パラ メータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デー タ 構造体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
getipnodebyaddr() に よ る IPv4 互換 IPv6 ア ド レ ス の処理方法 . . . . . . . . . . . . . . . . .
50
50
50
50
51
8. エ ラ ー メ ッ セージの読み出 し
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
パ ラ メ ー タ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
9. メ モ リ ーの解放
getaddrinfo() お よ び getnameinfo() 関数呼び出 し か ら の メ モ リ ーの解放 . . . . . . . . . . . 56
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6
目次
パラ メータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
getipnodebyaddr() お よ び getipnodebyname() 関数呼び出 し か ら の メ モ リ ーの解放 . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
パラ メータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
56
56
56
10. バイ ナ リ ア ド レ ス と テキス ト ア ド レ スの変換
テキ ス ト ア ド レ ス か ら バ イ ナ リ ア ド レ スへの変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バ イ ナ リ ア ド レ ス か ら テ キ ス ト ア ド レ スへの変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
58
58
58
11. マ ク ロ を使 っ た IPv6 ア ド レ スのス コ ープ と 種類の検査
12. ロー カル イ ン タ フ ェ ースの名前 と イ ンデ ッ ク スの識別
名前か ら イ ンデ ッ ク スへのマ ッ プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
イ ンデ ッ ク ス か ら 名前へのマ ッ プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
イ ン タ フ ェース のすべての名前 と イ ンデ ッ ク ス の取得 . . . . . . . . . . . . . . . . . . . . . . . . . .
メ モ リ ーの解放 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ヘ ッ ダー フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
62
62
62
62
62
63
63
63
63
13. IPv6 での ioctl() 関数呼び出 し を使 っ た イ ン タ フ ェ ースの構成または照会
14. IPv6 イ ン ス ト ールの検証
15. ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム
IPv4 TCP ク ラ イ ア ン ト の コ ー ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
getipnodebyname() を使用す る IPv6 TCP ク ラ イ ア ン ト . . . . . . . . . . . . . . . . . . . . . . .
ネーム / サービ ス の検索に getaddrinfo() を使用す る IPv6 TCP ク ラ イ ア ン ト . . . . . . .
IPv4 TCP サーバー コ ー ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
サービ ス ア ド レ ス の検索に getaddrinfo() を使用す る IPv6 TCP サーバー . . . . . . . . . .
70
72
73
74
75
A. IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド
既存の IPv4 間アプ リ ケーシ ョ ンは変更す る必要があ り ますか ? . . . . . . . . . . . . . . . . . . 78
要約 : ソ ース コ ー ド シ ン ボル と 関数の変更点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7
目次
シ ン ボル、 デー タ 構造体、 関数呼び出 し に必要な変更 . . . . . . . . . . . . . . . . . . . . . . . .
ハー ド コ ー ド さ れたデー タ 構造体のサ イ ズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
マルチキ ャ ス ト お よ び IPv4 のオプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ループバ ッ ク ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ワ イ ル ド カー ド ア ド レ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
マルチキ ャ ス ト のデフ ォ ル ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPv6 マルチキ ャ ス ト のオプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IP パケ ッ ト のオプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
サービ ス タ イ プのオプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
マルチキ ャ ス ト グループ、 IP ア ド レ ス、 IPv6 イ ン タ フ ェ ース イ ンデ ッ ク ス . . . . . .
8
79
80
80
80
80
81
81
82
82
83
本書について
本書は、 IPv4 ネ ッ ト ワー ク アプ リ ケーシ ョ ン を IPv6 に移植す る HP-UX BSD ソ ケ ッ ト アプ リ
ケーシ ョ ン プ ロ グ ラ マ向けの ド キ ュ メ ン ト です。
マニ ュ アルの出版日付 と 部品番号は、 マニ ュ アルの版を示 し てい ます。 出版の日付は、 最新版が
で き る たびに変更 し ます。 内容の小 さ な変更に対 し ては、 増刷の際に対応 し 、 出版日付の変更は
行い ません。 マニ ュ アルの部品番号は、 改訂が行われ る たびに変更 し ます。
新版の作成は、 記載内容の訂正 も し く は ド キ ュ メ ン ト 製品の変更に と も な っ て行われます。 改訂
版 ( ま たは新版 ) を受け取 る には、 適切な製品サポー ト サービ ス に登録 し なければな り ません。
詳細は、 当社の営業担当にお問い合わせ く だ さ い。
本書の最新版は、 次の Web サ イ ト にあ り ます。
日本語版 : http://docs.hp.com/ja/hpuxnetcom.html#IPv6
英語版 :
http://docs.hp.com/hpux/netcom/index.html#IPv6
原典
本書は、 『HP-UX IPv6 Porting Guide』 ( B2355-91069) を翻訳 し た も のです。
9
本書の構成
本書は、 以下の章か ら 構成 さ れてい ます。
第 1 章 「は じ めに」
第 2 章 「IPv6 ア ド レ ス」
第 3 章 「デー タ 構造体の相違点」
第 4 章 「IPv4 か ら IPv6 へのアプ リ ケーシ ョ ン の移行」
第 5 章 「IPv4 お よ び IPv6 の関数呼び出 し の設定概要」
第 6 章 「名前を ア ド レ ス に変換す る 関数呼び出 し 」
第 7 章 「IP ア ド レ ス を名前に変換す る 関数呼び出 し 」
第 8 章 「エ ラ ー メ ッ セージの読み出 し 」
第 9 章 「 メ モ リ ーの解放」
第 10 章 「バ イ ナ リ ア ド レ ス と テ キ ス ト ア ド レ ス の変換」
第 11 章 「マ ク ロ を使っ た IPv6 ア ド レ ス の ス コ ープ と 種類の検査」
第 12 章 「 ロ ーカル イ ン タ フ ェース の名前 と イ ンデ ッ ク ス の識別」
第 13 章 「IPv6 での ioctl() 関数呼び出 し を使っ た イ ン タ フ ェ ース の構成ま たは照会」
第 14 章 「IPv6 イ ン ス ト ールの検証」
第 15 章 「 ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム」
付録 A 「IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド 」
10
HP-UX の リ リ ース名 と リ リ ース ID
HP-UX 11i の各 リ リ ース には、 対応する リ リ ース名 と リ リ ース ID があ り ます。 uname (1) コ マ
ン ド に -r オプシ ョ ン を指定す る と 、 リ リ ース ID が表示 さ れ ます。 HP-UX 11i で利用可能な リ
リ ース を、 次の表に示 し ます。
表 1 HP-UX 11i リ リ ース
リ リ ース ID
リ リ ース名
サポー ト さ れてい る プ ロ
セ ッ サアーキテ ク チ ャ
B.11.31
HP-UX 11i v3
Intel® Itanium® お よ び
PA-RISC
B.11.23
HP-UX 11i v2
Intel® Itanium® お よ び
PA-RISC
B.11.22
HP-UX 11i v1.6
Intel® Itanium®
B.11.20
HP-UX 11i v1.5
Intel® Itanium®
B.11.11
HP-UX 11i v1
PA-RISC
関連 ド キ ュ メ ン ト
当社の ド キ ュ メ ン ト
HP-UX IPv6 ト ラ ン ス ポー ト についてのその他の情報は、 HP テ ク ニ カル ド キ ュ メ ン ト Web サ
イ ト http://docs.hp.com/ja にあ る 「I/O カー ド と ネ ッ ト ワー ク ソ フ ト ウ ェ ア 」 の 「IPv6」 を参
照 し て く だ さ い。
http://docs.hp.com/ja/hpuxnetcom.html#IPv6
こ のカ テ ゴ リ ーには、 本書の他に、 次の ド キ ュ メ ン ト があ り ます。
『HP-UX IPv6 ト ラ ン ス ポー ト 管理者ガ イ ド (HP-UX 11i v3)』
その他の ド キ ュ メ ン ト
詳細については、 RFC 2553 “Basic Socket Interface Extensions for IPv6” を参照 し て く だ さ い。
IETF (Internet Engineering Task Force) RFC は、 http://www.ietf.org/rfc.html にあ り ま
す。
11
マ ニ ュ アルに対する ご質問 ・ ご意見
本書に関す る フ ィ ー ド バ ッ ク は、 当社のテ ク ニ カル ド キ ュ メ ン ト Web サ イ ト にあ る 「カ ス タ マ
フ ィ ー ド バ ッ ク 」 ページ http://docs.hp.com/ja/feedback.html か ら お寄せ く だ さ い。
ご質問 ・ ご意見をお寄せいただ く 際は、 『HP-UX IPv6 ポーテ ィ ン グ ガ イ ド 』 の該当箇所のペー
ジ番号を明記 し て く だ さ い。
12
1 は じ めに
こ こ では、 既存の IPv4 アプ リ ケーシ ョ ンについての コ メ ン ト や、 IPv6 への移行、 一般的な用語
な ど について、 簡単に説明 し ます。
第1章
13
は じ めに
IPv6 に移行する理由
IPv6 に移行する理由
わずか 5 年の間に、 イ ン タ ーネ ッ ト は人々の生活を大 き く 変え ま し た。 イ ン タ ーネ ッ ト のす さ ま
じ い成長速度は、 未来学者 ら の予測を大 き く 超え た も ので、 イ ン タ ーネ ッ ト プ ロ ト コ ル (IP) の
設計者 も 、 20 年前には こ れほ ど の も の を予期 し てい ませんで し た。 IP バージ ョ ン 4 (IPv4) は、
1980 年代の間はネ ッ ト ワー ク の成長に十分なア ド レ ス を提供 し ま し たが、 現在では米国以外で
のア ド レ ス の供給は不十分です。 現在の イ ン タ ーネ ッ ト の成長速度が こ の ま ま続けば、 未割 り 当
ての IPv4 ア ド レ ス は 10 年以内に底をつ く と 予測 さ れます。 イ ン タ ーネ ッ ト プ ロ ト コ ル バー
ジ ョ ン 6 (IPv6) に よ っ て、 IPv4 の制限の多 く が克服 さ れ ます。
HP-UX IPv6 ト ラ ン ス ポー ト の使用についての詳細は、 必要に応 じ て次の ド キ ュ メ ン ト を参照 し
て く だ さ い。
『HP-UX IPv6 ト ラ ン ス ポー ト 管理者ガ イ ド (HP-UX 11i v3)』
対象読者
本書は、 IPv4 ネ ッ ト ワー ク アプ リ ケーシ ョ ン を IPv6 に移行 さ せ る 、 HP-UX BSD ソ ケ ッ ト ア
プ リ ケーシ ョ ン のプ ロ グ ラ マ を対象 と し てい ます。
既存の IPv4 ア プ リ ケーシ ョ ンは変更する必要があ り ますか ?
いいえ。 現在の IPv4 アプ リ ケーシ ョ ンは変更す る 必要はあ り ません。 新 し い IPv6 機能を利用 し
たい場合にだけ、 アプ リ ケーシ ョ ン を修正 し て く だ さ い。
14
第1章
は じ めに
IPv6 を実装する には、 IPv4 か ら完全に移行する必要があ り ますか ?
IPv6 を実装する には、 IPv4 か ら 完全に移行する必要があ り ますか ?
いいえ。 IPv6 プ ロ ト コ ル仕様書で定義 さ れてい る移行 メ カ ニ ズ ム を用い る と 、 段階を追っ て
IPv6 に移行す る こ と がで き ます。 IPv4 と IPv6 は今後 も 長期間共存す る で し ょ う 。 IPv6 プ ロ ト
コ ルの仕様では、 以下の 2 つの主要な移行 メ カ ニ ズ ム が提唱 さ れてい ます。
デ ュ アル ス タ ッ ク
デ ュ アル ス タ ッ ク ホ ス ト は、 IPv4 イ ン タ フ ェース と IPv6
イ ン タ フ ェ ース の両方が構成 さ れてお り 、 IPv4 ホ ス ト と
IPv6 ホ ス ト の ど ち ら と で も 通信で き ます。
ト ンネ リ ング
ト ン ネ リ ン グは、 IPv6 パケ ッ ト を IPv4 パケ ッ ト 内にカプ
セル化す る ために定義 さ れた メ カ ニズ ム です。 デ ュ アル ス
タ ッ ク ホ ス ト は、 IPv6 イ ン フ ラ ス ト ラ ク チ ャ がな く て も 、
IPv4 ト ン ネルを介 し て リ モー ト の IPv6 ホ ス ト に IPv6 パ
ケ ッ ト を送信す る こ と がで き ます。
第1章
15
は じ めに
用語
用語
こ こ では、 一般的な IP や IPv6 の用語の定義について簡単に説明 し ます。
一般的な IP 用語
ノード
IP (IPv4 ま たは IPv6、 あ る いは両方 ) を実装 し てい る デバ イ ス。
ルー タ ー
自分あ て と し て明示 さ れていない IP パケ ッ ト を転送す る ノ ー ド 。
ホス ト
ルー タ ー以外の ノ ー ド 。
リ ンク
2 つの ノ ー ド 間の論理的な接続。 こ こ では、 イ ーサネ ッ ト 、 PPP、 ATM ネ ッ
ト ワー ク な ど、 IP よ り 下位の層が リ ン ク 層です。 リ ン ク には、 IPv4 パケ ッ ト
内にカプセル化 さ れた IPv6 ト ラ フ ィ ッ ク も 含ま れ ます。 こ の手法を ト ン ネ リ
ン グ と 呼びます。
ネーム サービ ス ホ ス ト 名 と IP ア ド レ ス を マ ッ プす る デー タ ベース。 一般的なネーム サービ ス
には、 ド メ イ ン ネーム シ ス テ ム (DNS) や /etc/hosts フ ァ イ ルがあ り ます。
サイ ト
組織の イ ン ト ラ ネ ッ ト ( 地理的に分散 し てい る こ と も あ り ます )。
IPv6 用語
IPv4 ア ド レ ス
32 ビ ッ ト IPv4 ア ド レ ス。
IPv6 ア ド レ ス
128 ビ ッ ト IPv6 ア ド レ ス。
IPv4 専用 ノ ー ド IPv4 だけ を実装 し てい る ノ ー ド 。 IPv4 専用 ノ ー ド は IPv6 を認識 し ません。
IPv6 専用 ノ ー ド IPv6 専用に構成 さ れた ノ ー ド 。 IPv6 専用 ノ ー ド は IPv4 を認識 し ません。
IPv4/IPv6 ノ ー ド IPv4 と IPv6 の両方を実装 し てい る ノ ー ド 。
IPv6 ノ ー ド
IPv6 を実装 し てい る ノ ー ド 。 IPv4/IPv6 ノ ー ド と IPv6 専用 ノ ー ド は、 ど ち ら
も IPv6 ノ ー ド です。
IPv4 ノ ー ド
IPv4 を実装 し てい る ノ ー ド 。 IPv4/IPv6 ノ ー ド と IPv4 専用 ノ ー ド は、 ど ち ら
も IPv4 ノ ー ド です。
16
第1章
2 IPv6 ア ド レ ス
こ こ では、 IPv6 ア ド レ ス についての基本的な事項を説明 し ま す。
第2章
17
IPv6 ア ド レ ス
IPv6 ア ド レ スの種類
IPv6 ア ド レ スの種類
IPv6 は、 あ て先が 1 つの ( ユニ キ ャ ス ト ) ア ド レ ス と 、 あ て先が複数の ( マルチキ ャ ス ト ) ア ド
レ ス の両方を サポー ト し ます。 ア ド レ ス には 3 種類の ス コ ープがあ り ます。
IPv6 ア ド レ スのス コ ープ
リ ン ク ロ ーカル
1 つの ロ ーカル リ ン ク 上で使用 さ れ る IPv6 ア ド レ ス。 自動構成中に割 り 当て
ら れ ます。
グ ロ ーバル
イ ン タ ーネ ッ ト 上で使用 さ れ る IPv6 ア ド レ ス。
IPv6 ノ ー ド は、 常に リ ン ク ロ ーカルア ド レ ス を持っ てい ます。 IPv6 ノ ー ド は、 1 つ以上のグ
ロ ーバルア ド レ ス を持つ場合 も あ り ます。
IPv4 か ら IPv6 への移行時のア ド レ ス
IPv4 か ら IPv6 への移行を容易にす る ため、 IPv6 プ ロ ト コ ル仕様では、 IPv6 ア ド レ ス の下位
32 ビ ッ ト に IPv4 ア ド レ ス を埋め込んだ 2 種類のグ ロ ーバル IPv6 ア ド レ ス を定義 し てい ます。
IPv4 射影ア ド レ ス
IPv4 射影 IPv6 ア ド レ ス に よ り 、 IPv4/IPv6 ホ ス ト 上の IPv6 アプ リ ケーシ ョ ンは IPv4 専用
ノ ー ド と 通信す る こ と がで き ます。 IPv4 射影 IPv6 ア ド レ ス は、 IPv6 アプ リ ケーシ ョ ン が IPv4
ア ド レ ス専用 ノ ー ド のホ ス ト 名を要求 し た と き 、 ネーム サービ ス リ ゾルバに よ っ て内部で作成
さ れ ます。
18
第2章
IPv6 ア ド レ ス
IPv6 ア ド レ スの種類
IPv6 モジ ュ ールは、 IPv6 ア ド レ ス の下位 32 ビ ッ ト に IPv4 ア ド レ ス を エ ン コ ー ド し ます。
図 2-1
第2章
IPv4 射影ア ド レ ス
19
IPv6 ア ド レ ス
IPv4 ア ド レ ス と IPv6 ア ド レ スの比較
IPv4 ア ド レ ス と IPv6 ア ド レ スの比較
IPv4 ア ド レ ス は、 4 つのオ ク テ ッ ト を ド ッ ト 区切 り 10 進表記で表 し た、 32 ビ ッ ト ア ド レ ス で
す。
例 : 10.1.3.7
IPv6 ア ド レ ス は、 最高 4 桁ま での 16 進数か ら な る フ ィ ール ド 8 つで表 さ れ る 128 ビ ッ ト レ
コ ー ド です。 各フ ィ ール ド は コ ロ ン (:) で区切 ら れます。
例 : 8888:7777:6666:5555:4444:3333:2222:1111
先行するゼロは省略で き ます
例 : 0008:0007:0006:0005:0004:0003:0002:0001
こ のア ド レ ス は以下の よ う に も 表記で き ます。
8:7:6:5:4:3:2:1
0 し か含まない連続フ ィ ール ド は省略で き ます
例 : 0008:0000:0000:0000:0000:0003:0002:0001
こ のア ド レ ス は以下の よ う に も 表記で き ます。
8::3:2:1
注記
20
1 つの IP ア ド レ ス で省略で き る のは、 0 の連続フ ィ ール ド 1 つだけです。
第2章
IPv6 ア ド レ ス
IPv4 ア ド レ ス と IPv6 ア ド レ スの比較
IPv4 射影 IPv6 ア ド レ スは、 ド ッ ト 区切 り 10 進表記で IPv4 ア ド レ ス
を表示で き ます
IPv4 射影ア ド レ ス には、 下位 32 ビ ッ ト に IPv4 ア ド レ ス が含ま れてい ます。 16 進表記 と ド ッ ト
区切 り 10 進表記は混在 さ せて も 有効です。 た と えば、 IPv4 射影 IPv6 ア ド レ ス の
::ffff:10.9.8.7 は、 以下の よ う な フ ォ ーマ ッ ト で も 有効です。
0::ffff:0a09:0807
IPv4 射影 IPv6 ア ド レ ス
::ffff:0a09:0807
先頭の 0 を削除
::ffff:10.9.8.7
16 進表記 と 10 進表記の組み合わせ
IPv6 ア ド レ ス には ク ラ ス の概念がな く 、 CIDR (Classless Internet Domain Registry) フ ォー
マ ッ ト を使用 し てい ます。 IPv6 ア ド レ ス の後にプ レ フ ィ ッ ク ス が続 き (<IPv6 addr>”/”<prefix>)、
サブネ ッ ト のサ イ ズ を示 し ます。
例 : 8:7:6:5:4:3:2:1/16
第2章
21
IPv6 ア ド レ ス
IPv6 ア ド レ スの種類
IPv6 ア ド レ スの種類
ユニキ ャ ス ト ア ド レ ス
図 2-2
ユニキ ャ ス ト ア ド レ ス
通常、 ユニ キ ャ ス ト ア ド レ ス は、 64 ビ ッ ト のプ レ フ ィ ッ ク ス と 64 ビ ッ ト の イ ン タ フ ェース ID
で構成 さ れます。
図 2-3
ユニキ ャ ス ト プ レ フ ィ ッ ク ス
64 ビ ッ ト の イ ン タ フ ェース ID は、 リ ン ク 上で一意でなければな り ません。 多 く の場合、 イ ン タ
フ ェース ID には イ ン タ フ ェース の リ ン ク 層ア ド レ ス が含まれてい ます。
IPv6 ループバ ッ ク ア ド レ ス
ループバ ッ ク イ ン タ フ ェ ース では、 IP デー タ グ ラ ム を自身に送信 し て自己診断を行 う ために、
IPv6 ループバ ッ ク ア ド レ ス を使い ます。 IPv6 のループバ ッ ク ア ド レ ス は以下の と お り です。
0:0:0:0:0:0:0:1 ( ま たは省略形で ::1)
22
第2章
IPv6 ア ド レ ス
IPv6 ア ド レ スの種類
リ ン ク ロー カル ユニキ ャ ス ト ア ド レ ス
ア ド レ ス の自動構成 と 近隣探索に使用 さ れま す。 リ ン ク ロ ーカル ア ド レ ス の ス コ ープは LAN セ
グ メ ン ト です。
図 2-4
リ ン ク ロー カル ユニキ ャ ス ト ア ド レ ス
IPv6 マルチキ ャ ス ト ア ド レ ス
IPv6 マルチキ ャ ス ト ア ド レ ス は、 IPv4 マルチキ ャ ス ト ア ド レ ス と 似てい ますが、 ア ド レ ス ス
コ ープ を明示す る ための フ ィ ール ド があ り ま す。
第2章
23
IPv6 ア ド レ ス
IPv6 ア ド レ スの種類
図 2-5
マルチキ ャ ス ト ア ド レ スのフ ォ ーマ ッ ト
既知のマルチキ ャ ス ト ア ド レ ス ( 一部 )
FF02::1
すべての ノ ー ド ( リ ン ク ロ ーカル )
FF02::2
すべてのルー タ ー ( リ ン ク ロ ーカル )
FF02::9
すべての RIPng (Routing Information Protocol next generation) ルー タ ー (
リ ン ク ロ ーカル )
IPv6 ワ イル ド カ ー ド ア ド レ ス
IPv4 では、 アプ リ ケーシ ョ ンは ワ イ ル ド カー ド ア ド レ ス を指定す る こ と で、 ど の ソ ース IP ア ド
レ ス を ソ ケ ッ ト にバ イ ン ド す る か を シ ス テ ム に選択 さ せ る こ と がで き ます。 それには、 bind() 関
数呼び出 し で記号定数 INADDR_ANY を指定 し ます。 IPv6 では、 IPv6 のア ド レ ス型が構造体
(struct in6_addr) であ る ため、 記号定数で IPv6 ア ド レ ス の構造体変数を初期化す る こ と はで
き ますが、 IPv6 の構造体変数を代入す る こ と はで き ま せん。 そのため、 IPv6 の ワ イ ル ド カー ド
ア ド レ ス には以下の 2 つの形式が必要です。
•
24
初期化の場合は、struct in6_addr 型の記号定数 IN6ADDR_ANY_INIT を使用 し ます。 以下に
例を示 し ます。
第2章
IPv6 ア ド レ ス
IPv6 ア ド レ スの種類
struct in6_addr anyaddr = IN6ADDR_ANY_INIT;
注記
•
こ の定数は初期化の間だけ使用 し ます。
代入の場合は、in6_addr 構造体型のグ ロ ーバル変数 in6addr_any を使用 し ます。 以下に例を
示 し ます。
ヘ ッ ダー フ ァ イル
<netinet/in.h>
<netinet/in6.h>
extern const struct in6_addr in6addr_any;
struct sockaddr_in6 sin6;
sin6.sin6_addr = in6addr_any; /* structure assignment */
if (bind(s, (struct sockaddr *) &sin6, sizeof(sin6)) == -1)
IPv6 ループバ ッ ク ア ド レ ス
IPv4 ループバ ッ ク ア ド レ ス は、 整数型の INADDR_LOOPBACK です。 IPv6 ループバ ッ ク ア ド レ ス
は、 <netinet/in.h> で定義 さ れ る in6_addr 構造体です。 以下に例を示 し ます。
ヘ ッ ダー フ ァ イル
<netinet/in.h>
<netinet/in6.h>
sin6.sin6_addr = in6addr_loopback; /* structure assignment */
記号定数 IN6ADDR_LOOPBACK_INIT は、 <netinet/in.h> で定義 さ れます。 こ れは、
sockaddr_in6 構造体を宣言す る と き にのみ使用 し ます。 以下に例を示 し ます。
struct in6_addr loopbackaddr = IN6ADDR_LOOPBACK_INIT
注記
第2章
IPv4 は、 IPv4 ホ ス ト バ イ ト 順で INADDR_* 定数を定義 し ます。 一方、 IPv6 は
ネ ッ ト ワー ク バ イ ト 順で IN6ADDR_* お よ び in6addr* 定数を定義 し ます。
25
IPv6 ア ド レ ス
IPv6 ア ド レ スの種類
26
第2章
3 デー タ 構造体の相違点
第3章
27
デー タ 構造体の相違点
IP ア ド レ ス構造体
IP ア ド レ ス構造体
ヘ ッ ダー フ ァ イル
<netinet/in.h>
IPv4 構造体
struct in_addr {
unsigned int s_addr ; /* 32-bit
};
IPv4*/
IPv6 構造体
struct in6_addr {
uint8_t s6_addr[16];
} /* array of 16 8-bit elements = one 128-bit IPv6 address */
28
第3章
デー タ 構造体の相違点
4.3BSD ベースの HP-UX 用ソ ケ ッ ト ア ド レ ス構造体
4.3BSD ベースの HP-UX 用 ソ ケ ッ ト ア ド レ ス構造体
ヘ ッ ダー フ ァ イル
<netinet/in.h>
IPv4 構造体
struct sockaddr_in
short
u_short
struct in_addr
char
};
{
sin_family;
sin_port;
sin_addr;
sin_zero[8];
/*AF_INET */
/* transport layer port number */
/* IPv4 */
/* Unused */
IPv6 構造体
struct sockaddr_in6 {
sa_family_t
sin6_family;
in_port_t
sin6_port;
uint32_t
sin6_flowinfo;
struct in6_addr
sin6_addr;
uint32_t
sin6_scope_id;
}:
第3章
/*AF_INET6 */
/* transport layer port number.* /
/* traffic class */
/* IPv6*/
/* Address scope */
29
デー タ 構造体の相違点
汎用 ソ ケ ッ ト ア ド レ ス構造体
汎用 ソ ケ ッ ト ア ド レ ス構造体
ヘ ッ ダー フ ァ イル
<netinet/in.h>
struct sockaddr_storage
sockaddr_storage デー タ 構造体を使用すれば、 複数のア ド レ ス フ ァ ミ リ ーやプ ラ ッ ト フ ォ ー
ム に移植可能な コー ド を簡単に書 く こ と がで き ます。 こ のデー タ 構造体には、 以下の よ う な柔軟
性 と 整合性があ り ます。
•
アプ リ ケーシ ョ ン の作成者を補助す る ために ソ ケ ッ ト API に追加 さ れた も のが、 struct
sockaddr_storage 構造体です。 こ の構造体は十分に大 き く 、 サポー ト す る プ ロ ト コ ル固有
のア ド レ ス構造体をすべて格納で き ます。
•
sockaddr_storage は適切な境界に整列 さ れ る ため、 こ の構造体へのポ イ ン タ ーはプ ロ ト コ
ル固有のア ド レ ス構造体のポ イ ン タ ーにキ ャ ス ト し て、 整列の問題な し に適切な構造体の
フ ィ ール ド にア ク セ スす る ために使用で き ま す。
30
第3章
4 IPv4 か ら IPv6 へのア プ リ ケーシ ョ ンの
移行
HP-UX は、 標準の IPv4/IPv6 相互運用手法を 2 つサポー ト し てい ます。
•
IPv4/IPv6 デ ュ アル ス タ ッ ク
•
ト ン ネ リ ン グ : IPv4 パケ ッ ト 内に IPv6 パケ ッ ト を カプセル化 し 、そのパケ ッ ト を IPv4 ネ ッ ト
ワー ク 上でルーテ ィ ン グす る こ と で、 2 つの IPv6 ノ ー ド が通信で き ま す。
第4章
31
IPv4 か ら IPv6 へのア プ リ ケーシ ョ ンの 移行
IPv4/IPv6 デ ュ アル ス タ ッ ク
IPv4/IPv6 デ ュ アル ス タ ッ ク
HP-UX の IPv6 は、 IPv4/IPv6 のデ ュ アル プ ロ ト コ ル ス タ ッ ク をサポー ト し てい ます。 デ ュ ア
ル ス タ ッ ク は、 既存の IPv4 の ソ ース ま たはバ イ ナ リ フ ァ イ ルには影響を与え ません。 従来の
IPv4 間のアプ リ ケーシ ョ ンは、 IPv4 モジ ュールを通過す る 既存の コ ー ド パ ス に従い ます。
図 4-1
IPv4/IPv6 デ ュ アル ス タ ッ ク
ア プ リ ケーシ ョ ン層
ト ラ ン スポー ト 層
ネ ッ ト ワー ク 層
物理層
32
ア プ リ ケーシ ョ ン
TCP
IPv6
Ethernet
UDP
IPv4
FDDI
第4章
5 IPv4 および IPv6 の関数呼び出 し の設定
概要
こ こ では、 IPv4 お よ び IPv6 の関数呼び出 し の設定処理の概要を説明 し ます。
第5章
33
IPv4 およ び IPv6 の関数呼び出 し の設定 概要
AF_INET ソ ケ ッ ト を使用 し た IPv4 UDP の通信
AF_INET ソ ケ ッ ト を使用 し た IPv4 UDP の通信
図 5-1
AF_INET ソ ケ ッ ト を使用 し た IPv4 UDP の通信
1. アプ リ ケーシ ョ ン が、 gethostbyname() を呼び出 し て ホ ス ト 名 host1 を渡 し ます。
2. 検索でネーム サービ ス のデー タ ベース に host1 が見つか る と 、gethostbyname() が IPv4 ア
ド レ ス 1.2.3.4 を返 し ま す。
3. アプ リ ケーシ ョ ン が、 socket() 関数を呼び出 し て IPv4 AF_INET ソ ケ ッ ト を開 き ます。
4. アプ リ ケーシ ョ ン が、 1.2.3.4 ア ド レ スへの send() 関数を呼び出 し ます。
5. ソ ケ ッ ト 層が、 send 要求、 ソ ケ ッ ト 情報、 ア ド レ ス を UDP/IP モジ ュールに送信 し ます。
6. UDP/IP モジ ュールが、ア ド レ ス 1.2.3.4 を IPv4 パケ ッ ト のヘ ッ ダーに設定 し 、情報を IPv4
モジ ュ ールに渡 し て転送 し ます。
34
第5章
IPv4 およ び IPv6 の関数呼び出 し の設定 概要
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 UDP 通信での送信
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 UDP 通信での送信
AF_INET6 ソ ケ ッ ト は、 IPv6 通信 と IPv4 通信の両方に使用で き ます。 IPv4 の
gethostbyname() 関数呼び出 し ではな く 、 IPv6 は POSIX の関数呼び出 し getaddrinfo() を
使用 し ます。 IPv4 通信の場合は、 AF_INET6 ソ ケ ッ ト を作成 し 、 IPv4 射影 IPv6 ア ド レ ス ( 例、
::FFFF:1.2.3.4) が含ま れ る sockaddr_in6 構造体に ソ ケ ッ ト を渡 し ます。 下図に、 AF_INET6
ソ ケ ッ ト を使用 し て IPv4 パケ ッ ト を送信す る アプ リ ケーシ ョ ン の イ ベン ト シーケ ン ス を示 し ま
す。
図 5-2
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 UDP 通信での送信
1. アプ リ ケーシ ョ ン が、 getaddrinfo() を呼び出 し て以下の情報を渡 し ます。
•
ホ ス ト 名 (host2)
•
AF_INET6 ア ド レ ス フ ァ ミ リ ー(hint)。 ホ ス ト 名に対応す る IPv6 ア ド レ ス を ネーム サー
ビ ス に要求 し ます。
•
AI_V4MAPPED フ ラ グ (hint)。 ネーム サービ ス が host2 の IPv6 ア ド レ ス を見つけ ら れず、
IPv4 ア ド レ ス を見つけた場合に、 IPv4 射影 IPv6 ア ド レ ス の中の IPv4 ア ド レ ス を返す
よ う に し ます。 hint お よ びフ ラ グの値については、 後述の getaddrinfo(3N) を参照 し
て く だ さ い。
第5章
35
IPv4 およ び IPv6 の関数呼び出 し の設定 概要
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 UDP 通信での送信
2. ネーム サービ ス のデー タ ベース で host2 の IPv4 ア ド レ ス 1.2.3.4 が検出 さ れます。
3. getaddrinfo() に AI_V4MAPPED フ ラ グがセ ッ ト さ れてい る ため、関数は IPv4 射影ア ド レ ス
::FFFF:1.2.3.4 を返 し ます。
4. アプ リ ケーシ ョ ン が、 socket() 関数を呼び出 し て IPv6 AF_INET6 ソ ケ ッ ト を開 き ます。
5. アプ リ ケーシ ョ ン が、 ::FFFF:1.2.3.4 ア ド レ スへの sendto() 関数を呼び出 し ます。
6. ソ ケ ッ ト 層が、sendto 要求、ソ ケ ッ ト 情報、IPv4 射影 IPv6 ア ド レ ス を UDP/IP モジ ュ ールに
渡 し ます。
7. UDP/IP モジ ュールが以下の処理を行い ま す。
36
a.
IPv4 射影 IPv6 ア ド レ ス を識別 し ます。
b.
1.2.3.4 ア ド レ ス を IPv4 パケ ッ ト のヘ ッ ダーに設定 し ます。
c.
パケ ッ ト を IPv4 モジ ュ ールに渡 し 、 転送 し ます。
第5章
IPv4 およ び IPv6 の関数呼び出 し の設定 概要
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 通信での受信
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 通信での受信
AF_INET6 ソ ケ ッ ト を使用す る IPv6 アプ リ ケーシ ョ ンは、 リ モー ト の IPv4 アプ リ ケーシ ョ ン か
ら の TCP 接続要求を受け取 る こ と がで き ます。 下記の例は、 アプ リ ケーシ ョ ン の IPv6 ソ ケ ッ
ト あ ての着信 IPv4 パケ ッ ト を示 し てい ます。
こ の概要図では、 着信 し た IPv4 パケ ッ ト が IPv6 ソ ケ ッ ト への接続を要求 し ます。 IPv6 は、 内
部で IPv4 射影 IPv6 ア ド レ ス を作成 し 、 接続を受け入れ、 要求 し てい る ノ ー ド のホ ス ト 名を検
索 し ます。
図 5-3
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 通信での受信
1. IPv4 パケ ッ ト が、 イ ーサネ ッ ト ポー ト に到着 し ます。
2. イ ーサネ ッ ト ド ラ イ バが、 イ ーサネ ッ ト パケ ッ ト 内の type フ ィ ール ド を調べます。
type が 86DD の場合は IPv6 パケ ッ ト です
type が 0800 の場合は IPv4 パケ ッ ト です
第5章
37
IPv4 およ び IPv6 の関数呼び出 し の設定 概要
AF_INET6 ソ ケ ッ ト を使用 し た IPv4 通信での受信
こ こ では type が 0800 なので、 イ ーサネ ッ ト ド ラ イ バは イ ーサネ ッ ト ヘ ッ ダーを削除 し 、
IPv4 パケ ッ ト を IPv4/IP モジ ュ ールに渡 し ます。
IPv4/IP プ ロ ト コ ル ス タ ッ ク が、 こ の情報 と IPv4 射影 IPv6 ア ド レ ス (::FFFF:1.2.3.4) を
ソ ケ ッ ト 層に渡 し ます。
3. アプ リ ケーシ ョ ン が、 accept() を呼び出 し て リ モー ト 接続要求を受け入れます。 アプ リ ケー
シ ョ ンは、 確立 さ れた IPv6 ソ ケ ッ ト をすでに リ ス ン し てい ます。
4. アプ リ ケーシ ョ ン が、getnameinfo() を呼び出 し て IP ア ド レ ス ::FFFF:1.2.3.4 のホ ス ト 名
を検索 し ます。 詳細は、 後述の getnameinfo(3N) を参照 し て く だ さ い。
5. hosts デー タ ベース で 1.2.3.4 ア ド レ ス が検出 さ れ、 getnameinfo() がホ ス ト 名を返 し ま
す。
38
第5章
IPv4 およ び IPv6 の関数呼び出 し の設定 概要
IPv6 通信での AF_INET6 ソ ケ ッ ト の使用
IPv6 通信での AF_INET6 ソ ケ ッ ト の使用
IPv6 通信の場合は、 AF_INET6 ソ ケ ッ ト を作成 し 、 IPv4 射影 IPv6 ア ド レ ス ではない IPv6 ア ド
レ ス ( 例、 2fee:1212::200:2bff:fe2d:0c2c) を含む sockaddr_in6 構造体に AF_INET6 ソ
ケ ッ ト を渡 し ます。 下図に、 AF_INET6 ソ ケ ッ ト を使用 し て IPv6 パケ ッ ト を送信す る アプ リ ケー
シ ョ ン の イ ベン ト シーケ ン ス を示 し ます。
図 5-4
第5章
IPv6 通信での AF_INET6 ソ ケ ッ ト の使用
39
IPv4 およ び IPv6 の関数呼び出 し の設定 概要
IPv6 通信での AF_INET6 ソ ケ ッ ト の使用
1. アプ リ ケーシ ョ ンは getaddrinfo() を呼び出 し 、ホ ス ト 名 (host6)、IPv6 の AF_INET6 ア ド レ
ス フ ァ ミ リ ー (hint)、 お よ び AI_DEFAULT フ ラ グ (hint) を渡 し ます。 こ の hint フ ラ グに よ
り 、 host6 の IPv6 ア ド レ ス を探 し て、 見つか っ た ら 返す よ う 関数への指示が行われ ます。
hint の フ ィ ール ド と 値については、 getaddrinfo(3N) を参照 し て く だ さ い。
2. ホ ス ト デー タ ベース で host6 の IPv6 ア ド レ ス を検出 し 、 getaddrinfo が IPv6 ア ド レ ス
2fee:1212::200:2bff:fe2d:0c2c を返 し ます。
3. アプ リ ケーシ ョ ン が、 AF_INET6 ソ ケ ッ ト を開 き ます。
4. アプ リ ケーシ ョ ンは、 ア ド レ ス 2fee:1212::200:2bff:fe2d:0c2c に情報を送信 し ます。
5. ソ ケ ッ ト 層が、 情報 と ア ド レ ス を UDP モジ ュ ールに送信 し ます。
6. UDP モジ ュ ールが、 IPv6 ア ド レ ス を識別 し 、 ア ド レ ス 2fee:1212::200:2bff:fe2d:0c2c
をパケ ッ ト のヘ ッ ダーに設定 し 、 情報を IPv6 モジ ュ ールに渡 し て転送 し ます。
40
第5章
6 名前を ア ド レ スに変換する関数呼び出 し
従来の gethostbyname() 関数で も 、 特定のホ ス ト 名の IPv4 ア ド レ ス を検索で き ます。 し か し 、
こ の ラ イ ブ ラ リ コ ール関数では、 IPv6 や IPv4 射影な ど のア ド レ ス の種類を指定す る こ と はで
き ません。 IP ア ド レ ス検索用の新 し い IPv6 関数呼び出 し は以下の 2 つです。
•
getaddrinfo()
•
getipnodebyname()
第6章
41
名前を ア ド レ スに変換する関数呼び出 し
getaddrinfo(3N)
getaddrinfo(3N)
getaddrinfo() は、 ノ ー ド 名か ら ア ド レ ス、 サービ ス名か ら ポー ト 番号への変換を行 う 関数呼
び出 し です。 こ のプ ロ ト コ ルに依存 し ない関数呼び出 し は、 POSIX 1003.1g Draft 6.6 (1997) に
準拠 し てい ます。 詳細は、 getaddrinfo(3N) のマ ンページ を参照 し て く だ さ い。
構文
getaddrinfo(const char *nodename, const char *servname, const struct
addrinfo *hints, struct addrinfo **res);
パラ メ ー タ
*nodename
IPv4 の ド ッ ト 区切 り 10 進表記ア ド レ スや IPv6 の 16 進ア ド レ ス な ど の数字
文字列や ノ ー ド 名な どへのポ イ ン タ ーです。 NULL 文字列を指す こ と も で き ま
す。
*servname
サービ ス名 (ftp な ど ) ま たはポー ト 番号 (21 な ど ) へのポ イ ン タ ーです。
NULL 文字列を指す こ と も で き ます。 *nodename と *servname の ど ち ら か
が、 名前ま たは数字文字列を指 し ていなければな り ません。
*hints
ソ ケ ッ ト タ イ プ、 ア ド レ ス フ ァ ミ リ ー、 ま たはプ ロ ト コ ル タ イ プの フ ィ ル
タ ーが含ま れ る addrinfo 構造体へのポ イ ン タ ーです。 NULL 文字列を指す こ
と も で き ます。 addrinfo と hints については以下で説明 し ます。
**res
ソ ケ ッ ト ア ド レ ス と ソ ケ ッ ト に関す る 情報が含ま れ る addrinfo 構造体の リ
ン ク さ れた リ ス ト へのポ イ ン タ ーです。
hints が指す addrinfo デー タ 構造体
struct addrinfo {
int
ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST,
* See RFC 2553 for more details*/
int
ai_family;
/* PF_xxx */
int
ai_socktype; /* SOCK_xxx */
int
ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
size_t ai_addrlen;
/* length of ai_addr */
char
*ai_canonname; /* canonical name for nodename */
struct sockaddr *ai_addr; /* binary address */
struct addrinfo *ai_next; /* next structure in linked list */
};
42
第6章
名前を ア ド レ スに変換する関数呼び出 し
getaddrinfo(3N)
注記
第6章
hint の値を ai_flags、 ai_family、 ai_socktype、 ai_protocol に代入す る 前
に、 addrinfo デー タ 構造体の全体を 0 で初期化 し て く だ さ い。
43
名前を ア ド レ スに変換する関数呼び出 し
getipnodebyname(3N)
getipnodebyname(3N)
アプ リ ケーシ ョ ン プ ロ グ ラ ムは、 getipnodebyname() 関数を呼び出 し て IPv4/IPv6 ホ ス ト を検
索 し ます。
注記
HP-UX 11i v2 以降、 getipnodebyname() 関数は廃止予定 (OBSOLESCENCE)
と い う 扱いにな り ま し たので、 将来の HP-UX リ リ ース では廃止 さ れます。 こ の
ため、 代わ り に getaddrinfo() を使 う こ と をお勧め し ます。
構文
Host_ptr=getipnodebyname(const char *name, int addr_family, int flags, int
*error_num);
パラ メ ー タ
*name
IPv4 の ド ッ ト 区切 り 10 進表記ア ド レ スや IPv6 の 16 進ア ド レ ス な ど の数字
文字列や ノ ー ド 名へのポ イ ン タ ーです。
addr_family
関数が検索 し て返すア ド レ ス の型を設定す る 整数です。 addr_family は、
AF_INET (IPv4) ま たは AF_INET6 (IPv6) です。
flags
ア ド レ ス を返す条件を指定す る 整数です。 条件には、 IPv6 ア ド レ ス のみ、
IPv6 ア ド レ ス が見つか ら ない場合は IPv4 射影ア ド レ ス、 リ モー ト ノ ー ド の
名前に IP ア ド レ ス が 1 つ以上構成 さ れてい る 場合のみア ド レ ス を返す、 な ど
があ り ます。
*error_num
getipnodebyname() 関数が返すエ ラ ー コ ー ド へのポ イ ン タ ーです。
Host_ptr
getipnodebyname() 関数が返す hostent 構造体です。 こ の構造体には、
name の IP ア ド レ ス が 1 つ以上含ま れます。
hostent 構造体は、 以下のフ ィ ール ド で構成 さ れま す。
char *h_name
ホ ス ト (name) の正式名称 ( 完全修飾名 ) へのポ イ ン タ ーで
す。
char **h_alias
44
第6章
名前を ア ド レ スに変換する関数呼び出 し
getipnodebyname(3N)
ホ ス ト (name) のエ イ リ ア スへのポ イ ン タ ー配列へのポ イ ン
タ ーです。
int h_addrtype
hostent 構造体の中に返 さ れ る ア ド レ ス の型です。 IPv4 ア
ド レ ス の場合は AF_INET、 IPv6 ア ド レ ス の場合は
AF_INET6 です。
int h_length
name が指 し てい る IP ア ド レ ス の長 さ です。 4 オ ク テ ッ ト
(IPv4)、 ま たは 16 オ ク テ ッ ト (IPv6) です。
char **h_addr_list[0]
ホ ス ト 名の IPv4 ま たは IPv6 ア ド レ スへのポ イ ン タ ー配列
へのポ イ ン タ ーです。
第6章
45
名前を ア ド レ スに変換する関数呼び出 し
getipnodebyname(3N)
46
第6章
7 IP ア ド レ ス を名前に変換する関数呼び出 し
従来の gethostbyaddr() 関数で も 、 特定のア ド レ ス の IPv4 ホ ス ト 名を検索で き ます。 し か し 、
こ の ラ イ ブ ラ リ コール関数では、 IPv6 や IPv4 射影な ど のア ド レ ス の種類を指定す る こ と はで き
ません。 新 し い名前検索関数は以下の 2 つです。
•
getnameinfo(3N)
•
getipnodebyaddr(3N)
第7章
47
IP ア ド レ ス を名前に変換する関数呼び出 し
getnameinfo(3N)
getnameinfo(3N)
getnameinfo() 関数は、 ソ ケ ッ ト ア ド レ ス構造体を受け取 り 、 ノ ー ド 名ま たはサービ ス名を返
し ます。
ヘ ッ ダー フ ァ イル
#include <sys/socket.h>
#include <netdb.h>
構文
int getnameinfo(const struct sockaddr *sa, socklen_t salen,
char *host, size_t hostlen, char *serv, size_t servlen, int flags);
getnameinfo() 関数は、 ソ ケ ッ ト ア ド レ ス を ノ ー ド 名 と サービ ス の ロ ケーシ ョ ン に変換 し ま
す。 getnameinfo() の定義は getaddrinfo() の定義 と 同様です。
パラ メ ー タ
*sa
変換す る ソ ケ ッ ト ア ド レ ス構造体へのポ イ ン タ ーです。
sockelen_t
sa が指す ソ ケ ッ ト ア ド レ ス構造体のサ イ ズ ( 整数値 ) です。
*host
getnameinfo() が返すホ ス ト 名へのポ イ ン タ ーです。 ホ ス ト 名を見つけ ら れ
なか っ た場合、 関数はホ ス ト の IP ア ド レ ス を返 し ます。 host が NULL を指 し
てい る 場合や、 hostlen が 0 の場合、 host はホ ス ト 名あ る いは IP ア ド レ ス
を返 し ません。 host と serv の両方が、 NULL を指す こ と はで き ません。
hostlen
文字列 host の長 さ です。
*serv
getnameinfo() が返すサービ ス名へのポ イ ン タ ーです。 サービ ス名を見つけ
ら れなか っ た場合、 関数はサービ ス のポー ト 番号を返 し ます。 serv が NULL を
指 し てい る場合や、 servlen が 0 の場合、 serv はサービ ス名やポー ト 番号を
返 し ません。
servlen
文字列 serv の長 さ です。
flags
flags に よ り 、 関数のデフ ォ ル ト の処理を変更 し ます。
NI_NOFQDN
48
第7章
IP ア ド レ ス を名前に変換する関数呼び出 し
getnameinfo(3N)
セ ッ ト す る と 、 getnameinfo() は完全修飾 ド メ イ ン名
(FQDN) のホ ス ト 名だけ を返 し ます。
NI_NUMERICHOST
セ ッ ト す る と 、 getnameinfo() は数値形式のホ ス ト のア ド
レ ス だけ を返 し ま す。
NI_NAMEREQD
セ ッ ト す る と 、 getnameinfo() はホ ス ト 名が見つか ら ない
場合にエ ラ ーを返 し ます。
NI_NUMERICSERV
セ ッ ト す る と 、 getnameinfo() はサービ ス のポー ト 番号だ
け を返 し ま す。
NI_NUMERICSCOPE
セ ッ ト す る と 、 getnameinfo() は数値形式の ス コープ ID
を返 し ます。 sa パ ラ メ ー タ が IPv6 ア ド レ ス でない場合は無
視 さ れます。
NI_DGRAM
セ ッ ト す る と 、 サービ ス はデー タ グ ラ ム サービ ス
(SOCK_DGRAM) です。 デフ ォ ル ト では、 サービ ス は ス ト リ ー
ム サービ ス (SOCK_STREAM) です。 こ れで、 ポー ト 番号
(512-514 な ど ) を共有す る TCP と UDP のサービ ス が区別
さ れます。
第7章
49
IP ア ド レ ス を名前に変換する関数呼び出 し
getipnodebyaddr(3N)
getipnodebyaddr(3N)
IPv6 の getipnodebyaddr() 関数呼び出 し は IPv4 の gethostbyaddr() か ら の改良で、 エ ラ ー
番号のパ ラ メ ー タ が追加 さ れてい ます。
注記
HP-UX 11i v2 以降、 getipnodebyaddr() 関数は廃止予定 (OBSOLESCENCE)
と い う 扱いにな り ま し たので、 将来の HP-UX リ リ ース では廃止 さ れます。 こ の
ため、 代わ り に getnameinfo() を使 う こ と をお勧め し ます。
ヘ ッ ダー フ ァ イル
#include <sys/socket.h>
#include <netdb.h>
構文
name_ptr =getipnodebyaddr(const void *src, size_t len,int af, int *error_num);
パラ メ ー タ
*src
検索 さ れ る IP ア ド レ ス が格納 さ れてい る 構造体へのポ イ ン タ ーです。
len
IP ア ド レ ス の長 さ です。 AF_INET の場合は 4 オ ク テ ッ ト 、 AF_INET6 の場合は
16 オ ク テ ッ ト です。
af
ア ド レ ス フ ァ ミ リ ー。 AF_INET ま たは AF_INET6 です。
*error_num
エ ラ ーがあ る 場合に、 エ ラ ー コ ー ド が含ま れ る 整数へのポ イ ン タ ーです。
name_ptr
関数が返す hostent 構造体へのポ イ ン タ ーです。 構造体にはホ ス ト 名が含ま
れ ます。
デー タ 構造体
struct hostent {
char *h_name;
char **h_alias;
int
h_addrtype;
50
/* Canonical name of host name such as grace.hp.com*/
/* Pointer to an array of pointers to alias names */
/* AF_INET (for IPv4 addresses)AF_INET6 (for IPv6)*/
第7章
IP ア ド レ ス を名前に変換する関数呼び出 し
getipnodebyaddr(3N)
}
int
h_length;
/* 4 octets (IPv6) or 16 octets (IPv6) */
char **h_addr_list[0]; /* Pointer to an array of pointers to IPv4 */
/* addresses or IPv6 addresses */
getipnodebyaddr() によ る IPv4 互換 IPv6 ア ド レ スの処理方法
af が AF_INET6 の場合、 len は 16 で、 IPv6 ア ド レ ス は IPv4 射影ま たは IPv4 互換 IPv6 ア ド
レ ス です。 こ の場合、 以下の処理を し ます。
1. IPv6 ア ド レ ス の最初の 12 バ イ ト を ス キ ッ プ し ます。
2. af に AF_INET を設定 し ます。
3. len に 4 を設定 し ます。
af が AF_INET の場合、 与え ら れた IPv4 ア ド レ ス の名前を検索 し ます。 すなわち、
in-addr.arpa ド メ イ ン内の PTR レ コ ー ド を照会 し ます。
af が AF_INET6 の場合、 与え ら れた IPv6 ア ド レ ス の名前を検索 し ます。 すなわち、 ip6.int ド
メ イ ン内の PTR レ コ ー ド を照会 し ます。
関数呼び出 し が成功す る と 、 返 さ れ る hostent name_ptr 構造体に *src と af が コ ピー さ れま
す。 失敗す る と 、 ゼ ロ でない error_num が返 さ れます。
第7章
51
IP ア ド レ ス を名前に変換する関数呼び出 し
getipnodebyaddr(3N)
52
第7章
8 エ ラ ー メ ッ セージの読み出 し
IPv6 関数の getipnodebyaddr()、 getipnodebyname()、 getaddrinfo()、 お よ び
getnameinfo() は、 ス レ ッ ド セーフ な構造体でエ ラ ーを返 し ます。 gai_strerror() 関数呼び
出 し は、 渡 さ れたエ ラ ー コ ー ド を説明す る文字列を返 し ます。
第8章
53
エ ラ ー メ ッ セージの読み出 し
ヘ ッ ダー フ ァ イル
ヘ ッ ダー フ ァ イル
#include <netdb.h>
構文
char *gai_strerror(int ecode);
パラ メ ー タ
ecode
54
RFC 2553、 “Basic Socket Extensions for IPv6” (IPv6 向け基本 ソ ケ ッ ト イ ン
タ フ ェース拡張 ) で定義 さ れてい る EAI_xxx 値のいずれかです。 戻 り 値は、 エ
ラ ーを説明す る 文字列を ポ イ ン ト し てい ます。 ecode が EAI_xxx 値のいずれ
で も ない場合、 関数は不特定エ ラ ーを示す文字列へのポ イ ン タ ーを返 し ます。
第8章
9
メ モ リ ーの解放
IPv6 の名前 と ア ド レ ス を変換す る 4 つの関数呼び出 し は、 すべて動的に メ モ リ ーを割 り 当て ま
す。 IPv6 は、 メ モ リ ーを解放す る ための関数呼び出 し を 2 つ提供 し ます。
第9章
55
メ モ リ ーの解放
getaddrinfo() お よび getnameinfo() 関数呼び出 し か らの メ モ リ ーの解放
getaddrinfo() および getnameinfo() 関数呼び出 し か ら の メ モ リ ーの
解放
関数呼び出 し freeaddrinfo() は、 getaddrinfo() ま たは getnameinfo() 関数が返す 1 つ以
上の addrinfo 構造体の メ モ リ ーを解放 し ます。
ヘ ッ ダー フ ァ イル
#include <netdb.h>
構文
void freeaddrinfo(struct addrinfo *ai);
パラ メ ー タ
*ai
addrinfo 構造体へのポ イ ン タ ーです。
getipnodebyaddr() および getipnodebyname() 関数呼び出 し か ら の
メ モ リ ーの解放
関数呼び出 し freehostent() は、 getipnodebyaddr() ま たは getipnodebynameinfo() 関数
が返す 1 つ以上の hostent 構造体の メ モ リ ーを解放 し ます。
構文
void freehostent(struct hostent *ptr);
パラ メ ー タ
*ptr
56
hostent 構造体へのポ イ ン タ ーです。
第9章
10 バイ ナ リ ア ド レ ス と テキス ト ア ド レ スの
変換
IPv4 の関数呼び出 し では、 以下の よ う に IPv4 ア ド レ ス が変換 さ れ ます。
inet_aton() ま たは inet_addr() 関数は、 ド ッ ト 区切 り 10 進表記文字列 (10.9.8.7 な ど ) を
ネ ッ ト ワー ク バ イ ト 順で 32 ビ ッ ト バ イ ナ リ に変換 し ます。
inet_ntoa() は、 ネ ッ ト ワ ー ク バ イ ト 順の 32 ビ ッ ト バ イ ナ リ を ド ッ ト 区切 り 10 進表記文字列
(10.9.8.7 な ど ) に変換 し ます。
2 つの新 し い IPv6 関数は、 IPv4 ア ド レ ス と IPv6 ア ド レ ス の両方を変換 し ます。
第 10 章
57
バイ ナ リ ア ド レ ス と テキス ト ア ド レ スの 変換
テキス ト ア ド レ スか らバイ ナ リ ア ド レ スへの変換
テキス ト ア ド レ スか ら バイ ナ リ ア ド レ スへの変換
構文
void inet_pton(int addr_family, const char *strptr, void *addrptr)
inet_pton() 関数呼び出 し は、 addrptr が指すバ ッ フ ァ ー内の strptr が指す IP ア ド レ ス を文
字列 (presentation) 形式か ら バ イ ナ リ (numeric) 形式に変換 し ます。
バイ ナ リ ア ド レ スか ら テキス ト ア ド レ スへの変換
構文
inet_ntop(int family, const void *addrptr, char *strptr, site_t len)
inet_ntop() 関数呼び出 し は、 IP ア ド レ ス を 数値形式か ら 文字列形式に変換 し ます。 オーバー
フ ロ ーを防 ぐ ために、 len パ ラ メ ー タ で、 呼び出 し 側の関数のバ ッ フ ァ ー サ イ ズ を指定 し ます。
<netinet/in.h> ヘ ッ ダー フ ァ イ ル内の 2 箇所の定義で、 IPv4 お よ び IPv6 ア ド レ ス のバ ッ
フ ァ ー サ イ ズ を指定 し ます。
#define
#define
58
INET_ADDRSTRLEN
INET6_ADDRSTRLEN
16
46
/* for IPv4 dotted-decimal */
/* for IPv6 hex string */
第 10 章
11 マ ク ロ を使 っ た IPv6 ア ド レ スのス コ ープ と
種類の検査
以下のマ ク ロ は、 IPv6 ア ド レ ス の種類の検査に使用 し ます。 最初の 7 つのマ ク ロ は、 ア ド レ ス
が指定 さ れた種類であれば true を返 し 、 そ う でない場合は false を返 し ます。 後の 5 つのマ ク ロ
は、 ア ド レ ス が指定 さ れた ス コープのマルチキ ャ ス ト ア ド レ ス であれば true を返 し 、 ア ド レ ス
がマルチキ ャ ス ト ア ド レ ス でないか、 指定 さ れた ス コ ープのア ド レ ス でなければ false を返 し ま
す。
注記
int
int
int
int
int
int
int
IN6_IS_ADDR_LINKLOCAL と IN6_IS_ADDR_SITELOCAL は、 ど ち ら も 、 リ ン ク
ロ ーカル ス コ ープ ま たはサ イ ト ロ ーカル ス コ ープの IPv6 ユニ キ ャ ス ト ア ド レ ス
の場合にだけ true を返 し ます。 こ れ ら 2 つのマ ク ロ は、 リ ン ク ロ ーカル ス コ ー
プ、 ま たはサ イ ト ロ ーカル ス コ ープの IPv6 マルチキ ャ ス ト ア ド レ ス の場合には
true を返 し ません。
IN6_IS_ADDR_UNSPECIFIED
IN6_IS_ADDR_LOOPBACK
IN6_IS_ADDR_MULTICAST
IN6_IS_ADDR_LINKLOCAL
IN6_IS_ADDR_SITELOCAL
IN6_IS_ADDR_V4MAPPED
IN6_IS_ADDR_V4COMPAT
(const
(const
(const
(const
(const
(const
(const
struct
struct
struct
struct
struct
struct
struct
in6_addr
in6_addr
in6_addr
in6_addr
in6_addr
in6_addr
in6_addr
*);
*);
*);
*);
*);
*);
*);
以下のマ ク ロ は、 IPv6 マルチキ ャ ス ト ア ド レ ス の ス コ ープ を検査 し ます。
int
int
int
int
int
IN6_IS_ADDR_MC_NODELOCAL(const
IN6_IS_ADDR_MC_LINKLOCAL(const
IN6_IS_ADDR_MC_SITELOCAL(const
IN6_IS_ADDR_MC_ORGLOCAL (const
IN6_IS_ADDR_MC_GLOBAL
(const
第 11 章
struct
struct
struct
struct
struct
in6_addr
in6_addr
in6_addr
in6_addr
in6_addr
*);
*);
*);
*);
*);
59
マ ク ロ を使 っ た IPv6 ア ド レ スのス コ ープ と 種類の検査
60
第 11 章
12 ロー カル イ ン タ フ ェ ースの名前 と イ ンデ ッ
ク スの識別
IPv6 ソ ケ ッ ト API は、 イ ン タ フ ェース イ ンデ ッ ク ス ( 小 さ な正の整数 ) を使っ て、 マルチキ ャ
ス ト グループに参加 し てい る ロ ーカル イ ン タ フ ェース を識別 し ます。 通常、 イ ン タ フ ェ ース は
“lan0” な ど の名前で呼ばれ ま す。 HP-UX の実装では、 シ ス テ ムが イ ン タ フ ェース を構成す る と
き 、 カーネルが一意な正の整数値 ( イ ン タ フ ェース イ ンデ ッ ク ス ) を その イ ン タ フ ェース に割 り
当て ます。 こ の小 さ な正の整数は 1 か ら 始ま り ます。 イ ン タ フ ェース の番号付けは、 必ず し も 連
続 し てい る必要はあ り ません。
こ の API は、 以下の も のを定義 し ます。
•
•
イ ン タ フ ェース名 と イ ンデ ッ ク ス の間を マ ッ プす る 2 つの関数
•
if_nametoindex()
•
if_indextoname()
すべての イ ン タ フ ェース の名前 と イ ンデ ッ ク ス を返す関数
•
•
if_nameindex()
前の関数が割 り 当てた動的 メ モ リ ーを返すための関数
•
if_freenameindex()
第 12 章
61
ロ ー カル イ ン タ フ ェ ースの名前 と イ ンデ ッ ク スの識別
名前か ら イ ンデ ッ ク スへのマ ッ プ
名前か ら イ ンデ ッ ク スへのマ ッ プ
最初の関数は、 イ ン タ フ ェース の名前を それに対応する イ ンデ ッ ク ス にマ ッ プ し ます。
ヘ ッ ダー フ ァ イル
#include <net/if.h>
構文
unsigned int
if_nametoindex(const char *ifname);
指定 さ れた イ ン タ フ ェース名が存在 し ない場合、 関数は値 0 を返 し 、 errno に ENXIO を設定 し
ます。 シ ス テ ム エ ラ ーが発生す る と ( メ モ リ ー不足な ど )、 関数は値 0 を返 し 、 errno に適切な
値 (ENOMEM な ど ) を設定 し ます。
イ ンデ ッ ク スか ら 名前へのマ ッ プ
次の関数は、 イ ン タ フ ェース の イ ンデ ッ ク ス を それに対応する 名前にマ ッ プ し ます。
ヘ ッ ダー フ ァ イル
#include <net/if.h>
構文
char
*if_indextoname(unsigned int ifindex, char *ifname);
ifname パ ラ メ ー タ は、 IF_NAMESIZE バ イ ト 以上の大 き さ のバ ッ フ ァ ーを ポ イ ン ト し ていなけれ
ばな り ません。 こ の関数は、指定 さ れた イ ンデ ッ ク ス の イ ン タ フ ェース名を ifname に返 し ます。
(IF_NAMESIZE は <net/if.h> で も 定義 さ れ、 その値には イ ン タ フ ェ ース名の最後に終端の
NULL バ イ ト が含ま れてい ます。 ) if_indextoname へのポ イ ン タ ー も 、 関数の値を返 し ます。
指定 さ れた イ ンデ ッ ク ス に対応す る イ ン タ フ ェース がない場合、 関数は NULL を返 し 、 errno
に ENXIO を設定 し ます。 シ ス テ ム エ ラ ーが発生する と ( メ モ リ ー不足な ど )、
if_indextoname() は NULL を返 し 、 errno に適切な値 (ENOMEM な ど ) を設定 し ます。
62
第 12 章
ロ ー カル イ ン タ フ ェ ースの名前 と イ ンデ ッ ク スの識別
イ ン タ フ ェ ースのすべての名前 と イ ンデ ッ ク スの取得
イ ン タ フ ェ ースのすべての名前 と イ ンデ ッ ク スの取得
if_nameindex 構造体は、 1 つの イ ン タ フ ェース に関す る 情報を保持 し ます。 こ の構造体の定義
は、 ヘ ッ ダー フ ァ イ ル <net/if.h> にあ り ます。
struct if_nameindex {
unsigned int
if_index;
char
*if_name;
};
/* 1, 2, ... */
/* null terminated name: "le0", .. */
最後の関数は、 if_nameindex 構造体の配列を返 し ます。 イ ン タ フ ェース ご と に 1 つの構造体を
返 し ます。
struct if_nameindex
*if_nameindex(void);
if_nameindex 関数は、 if_index の値を 0 に し 、 if_name の値を NULL に し た構造体を返す こ
と で、 構造体の配列の最後を知 ら せます。 エ ラ ーが発生す る と 、 関数は NULL ポ イ ン タ ーを返
し 、 errno に適切な値を設定 し ます。
if_nameindex() 関数は、 if_nameindex 構造体の配列 と if_name の イ ン タ フ ェ ース名のため
に メ モ リ ーを動的に獲得 し ます。 if_freenameindex() 関数がその メ モ リ ーを解放 し ます。
メ モ リ ーの解放
if_freenameindex() 関数は、 if_nameindex() が割 り 当てた動的 メ モ リ ーを解放 し ます。
ヘ ッ ダー フ ァ イル
#include <net/if.h>
構文
void
if_freenameindex(struct if_nameindex *ptr);
パ ラ メ ー タ ptr は前述の if_nameindex() 呼び出 し で返 さ れ る ポ イ ン タ ーです。
第 12 章
63
ロ ー カル イ ン タ フ ェ ースの名前 と イ ンデ ッ ク スの識別
イ ン タ フ ェ ースのすべての名前 と イ ンデ ッ ク スの取得
64
第 12 章
13 IPv6 での ioctl() 関数呼び出 し を使 っ た
イ ン タ フ ェ ースの構成または照会
一部の IPv4 アプ リ ケーシ ョ ン では、 ノ ー ド のネ ッ ト ワー ク イ ン タ フ ェース の詳細な構成情報が
必要にな り ます。 それ ら のアプ リ ケーシ ョ ンは、 /usr/include/sys/ioctl.h で定義 さ れてい
る よ う に、 SIOCGIFCONF、 SIOCGIFADDR、 SIOCGIFFLAGS な ど の ioctl() 関数呼び出 し を使用
し て、 ネ ッ ト ワー ク イ ン タ フ ェ ース の特性お よ び属性を識別 し ます。
IPv4 SIOC* ioctl() 関数呼び出 し はすべて、SIOC* ioctl() 関数呼び出 し の引 き数の 1 つ と し
て struct ifreq デー タ 構造体 (/usr/include/net/if.h で定義 ) を使用 し ます。 し か し 、IPv4
用に定義 さ れた ifreq デー タ 構造体は、 IPv6 ア ド レ ス を保持する には小 さ すぎ ます。 そのため、
従来の IPv4 SIOC* お よ び関連す る デー タ 構造体は、 IPv6 アプ リ ケーシ ョ ンには適 し ません。
IPv6 用の新 し い ioctl() 関数呼び出 し は、 SIOCSL* お よ び SIOCGL* ioctl() の name フ ォー
マ ッ ト に従い ます。 IPv6 での ioctl() 関数呼び出 し は、 後述の大 き いデー タ 構造体 も 使用 し ま
す。 その他の点では、 IPv4 ioctl() 関数呼び出 し と 等価です。
注記
IPv6 SIOCSL* お よ び SIOCGL* ioctl() 関数呼び出 し は、IPv4 アプ リ ケーシ ョ ン
ではサポー ト さ れ ません。
IPv6 お よ び IPv4 の ioctl() 関数呼び出 し の定義は、/usr/include/sys/ioctl.h にあ り ます。
注記
IPv6 ア ド レ ス用には大 き なデー タ 構造体を使用 し て く だ さ い。 IPv6 ア ド レ ス は、
IPv4 SIOC* ioctl() 関数呼び出 し が使用す る IPv4 struct ifreq デー タ 構造体
には格納で き ません。 IPv6 アプ リ ケーシ ョ ンは IPv6 の ioctl() 関数へのパ ラ
メ ー タ と し て、 struct if_laddrreq お よ び struct if_laddrconf デー タ 構造
体を渡 し ます。
IPv4 の ioctl() デー タ 構造体は、/usr/include/net/if.h にあ り ます。 IPv6 の
ioctl() デー タ 構造体は、 /usr/include/net/if6.h にあ り ます。
第 13 章
65
IPv6 での ioctl() 関数呼び出 し を使っ た イ ン タ フ ェ ースの構成または照会
66
第 13 章
14 IPv6 イ ン ス ト ールの検証
以下の コ ー ド に、 HP-UX に IPv6 が実装 さ れてい る か ど う か を アプ リ ケーシ ョ ン がプ ロ グ ラ ム
で判定す る方法を示 し ます。 アプ リ ケーシ ョ ンは、 コ ンパ イ ル時や実行時に /dev/ip6 デバ イ ス
フ ァ イ ルの存在をチ ェ ッ ク し て、 シ ス テ ムに IPv6 API お よ び IPv6 ス タ ッ ク があ る か ど う か を
判定す る こ と がで き ます。 /dev/ip6 が存在 し ない場合、 アプ リ ケーシ ョ ンは IPv4 API を使い
続け ます。
if ((fd = open("dev/ip6", O_RDWR)) == -1)
/*
* /dev/ip6 failed to open., Therefore the IPv6 product
* is not installed on the system. An application should use the
* existing IPv4 code.
*/
...
else
/*
* dev/ip6 exists, so the IPv6 product is probably installed.
* IPv6 APIs can handle both IPv4 and IPv6 traffic */
注記
第 14 章
HP-UX 11i v2 以降、 IPv6 が自動的に HP-UX に組み込まれます。
67
IPv6 イ ン ス ト ールの検証
68
第 14 章
15 クライアント / サーバー サンプル プログラム
以下で示す コ ー ド は、 HP-UX 11i v3 の /usr/lib/demos/networking/socket デ ィ レ ク ト リ に
格納 さ れてい る も の と 同 じ IPv4 ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム をベース に し てい
ます。
ク ラ イ ア ン ト は、 example と い う サービ ス を要求 し ます。 ク ラ イ ア ン ト の /etc/services フ ァ
イ ルに、 example 用のエン ト リ ーを追加 し て く だ さ い。 example サービ ス用のポー ト ア ド レ ス
と し て、 22375 な ど の未使用のポー ト 番号を割 り 当てて く だ さ い。 サーバーを実行す る ホ ス ト で
も 、 /etc/services フ ァ イ ル内の example に、 同 じ ポー ト 番号を割 り 当てておかなければな り
ません。
第 15 章
69
ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム
IPv4 TCP ク ラ イ ア ン ト のコ ー ド
IPv4 TCP ク ラ イ ア ン ト の コ ー ド
以下の コ ー ド は、 HP-UX の /usr/lib/demos/networking/socket デ ィ レ ク ト リ に格納 さ れて
い る も の と 同 じ IPv4 ク ラ イ ア ン ト プ ロ グ ラ ム の一部です。
ク ラ イ ア ン ト は、 “example” と い う サービ ス を要求 し ます。 /etc/services フ ァ イ ルに
“example”用のエン ト リ ーを追加 し て く だ さ い。 “example”サービ ス用のポー ト ア ド レ ス と し て、
22375 な ど の未使用のポー ト 番号を割 り 当てて く だ さ い。 サーバーを実行す る ホ ス ト で も 、
/etc/services フ ァ イ ル内の “example” に、 同 じ ポー ト 番号を割 り 当て ておかなければな り ま
せん。
struct sockaddr_in peeraddr_in; /* for peer socket address */
memset ((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in));
hp = gethostbyname (argv[1]);
if (hp == NULL) {
fprintf(stderr, "%s: %s not found in /etc/hosts\n",
argv[0], argv[1]);
exit(1);
}
peeraddr_in.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
/* Find the information for the "example" server
* in order to get the needed port number.
*/
sp = getservbyname ("example", "tcp");
if (sp == NULL) {
fprintf(stderr, "%s: example not found in /etc/services\n argv[0]);
exit(1);
}
peeraddr_in.sin_port = sp->s_port;
/* Create the socket. */
s = socket (AF_INET, SOCK_STREAM, 0);
if (s == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to create socket\n", argv[0]);
exit(1);
}
/* Try to connect to the remote server at the address put in peeraddr.
*/
if (connect(s, &peeraddr_in, sizeof(struct sockaddr_in)) == -1{
70
第 15 章
ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム
IPv4 TCP ク ラ イ ア ン ト のコ ー ド
perror(argv[0]);
fprintf(stderr, "%s: unable to connect to remote\n", argv[0]);
exit(1);
}
第 15 章
71
ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム
getipnodebyname() を使用する IPv6 TCP ク ラ イ ア ン ト
getipnodebyname() を使用する IPv6 TCP ク ラ イ ア ン ト
以下の コ ー ド は、 HP-UX 11i v3 の /usr/lib/demos/networking/socket/af_inet6 デ ィ レ ク
ト リ に格納 さ れてい る IPv6 ク ラ イ ア ン ト サン プル プ ロ グ ラ ム の一部を、 getipnodebyname()
関数呼び出 し を使用す る よ う に書 き 換え た も のです。
struct sockaddr_in6 peeraddr_in6;
/* for peer socket address */
memset ((char *)&peeraddr_in6, 0, sizeof(struct sockaddr_in6));
hp = getipnodebyname (argv[1], AF_INET6, AI_DEFAULT, &error);
if (hp == NULL) {
fprintf(stderr, "%s: %s not found in /etc/hosts\n",
argv[0], argv[1]);
exit(1);
}
peeraddr_in6.sin6_family = hp->h_addrtype;
memcpy(&peeraddr_in6.sin6_addr, hp->h_addr, hp->h_length);
/* Find the information for the "example" server
* in order to get the needed port number.
*/
sp = getservbyname ("example", "tcp");
if (sp == NULL) {
fprintf(stderr, "%s: example not found in /etc/services\n",
argv[0]);
exit(1);
}
peeraddr_in6.sin6_port = sp->s_port;
/* Create the socket. */
s = socket (AF_INET6, SOCK_STREAM, 0);
if (s == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to create socket\n", argv[0]);
exit(1);
}
/* Try to connect to the remote server at the address
* which was just built into peeraddr.
*/
if (connect(s, &peeraddr_in6, sizeof(peeraddr_in6)) == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to connect to remote\n", argv[0]);
exit(1);
}
72
第 15 章
ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム
ネーム / サービ スの検索に getaddrinfo() を使用する IPv6 TCP ク ラ イ ア ン ト
ネーム / サービ スの検索に getaddrinfo() を使用する IPv6 TCP ク ラ
イアン ト
こ の IPv6 TCP ク ラ イ ア ン ト の コ ー ド は、 前出の IPv6 ク ラ イ ア ン ト の コ ー ド の一部ですが、
gethostbyname() ではな く getaddrinfo() を使用 し てい ます。
struct addrinfo *res, *ainfo;
struct addrinfo hints;
/* clear out hints */
memset ((char *)&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
error =
getaddrinfo(argv[1], "example", &hints, &res);
if (error != 0) {
fprintf(stderr, "%s: %s not found in name service database\n",
argv[0], argv[1]);
exit(1);
}
for (ainfo = res; ainfo != NULL; ainfo = ainfo->ai_next) {
/* Create the socket. */
s = socket (ainfo->ai_family,ainfo->ai_socktype,
ainfo->ai_protocol);
if (s == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to create socket\n", argv[0]);
freeaddrinfo(res);
exit(1);
}
if (connect(s, ainfo->ai_addr, ainfo->ai_addrlen) == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to connect to remote\n", argv[0]);
close(s);
continue;
}
else
break;
}
第 15 章
73
ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム
IPv4 TCP サーバー コ ー ド
IPv4 TCP サーバー コ ー ド
以下の コ ー ド は、 HP-UX 11i v3 の /usr/lib/demos/networking/socket デ ィ レ ク ト リ に格納
さ れてい る も の と 同 じ IPv4 サーバー プ ロ グ ラ ム例の一部です。
struct sockaddr_in6 peeraddr_in6;
/* for peer socket address */
sp = getservbyname ("example", "tcp");
if (sp == NULL) {
fprintf(stderr, "%s: example not found in /etc/services\n",argv[0]);
exit(1);
}
myaddr_in.sin_port = sp->s_port;
/* Create the listen socket. */
ls = socket (AF_INET, SOCK_STREAM, 0);
if (ls == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to create socket\n", argv[0]);
exit(1);
}
/* Bind the listen address to the socket. */
if (bind(ls, &myaddr_in, sizeof(struct sockaddr_in)) == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to bind address\n", argv[0]);
exit(1);
}
/* Initiate the listen on the socket so remote users
* can connect. The listen backlog is set to 5, which
* is within the supported range of 1 to 20.
*/
if (listen(ls, 5) == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to listen on socket\n", argv[0]);
exit(1);
}
74
第 15 章
ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム
サービ ス ア ド レ スの検索に getaddrinfo() を使用する IPv6 TCP サーバー
サービ ス ア ド レ スの検索に getaddrinfo() を使用する IPv6 TCP サー
バー
以下の コ ー ド は、 HP-UX 11i v3 の /usr/lib/demos/networking/socket/af_inet6 デ ィ レ ク
ト リ に格納 さ れてい る IPv6 サーバー サン プル プ ロ グ ラ ム の一部を、 getaddrinfo() 関数呼び
出 し を使用す る よ う に書 き 換え た も のです。
struct addrinfo *ainfo, *res;
struct addrinfo hints;
/* zero-out the hints before assignment */
memset (&hints, 0, sizeof(hints));
.
hints.ai_family = AF_INET6;
hints.ai_flags = AI_PASSIVE;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(NULL, "example", &hints, &res);
if (error != 0) {
fprintf(stderr, "%s: %s for service 'example'\n",
argv[0], gai_strerror(error));
exit(1);
}
/* Create the listen socket. */
ls = socket (res->ai_family, res->ai_socktype, res->ai_protocol);
if (ls == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to create socket\n", argv[0]);
exit(1);
}
/* Bind the listen address to the socket. */
if (bind(ls, res->ai_addr, res->ai_addrlen) == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to bind address\n", argv[0]);
close(ls);
exit(1);
}
/* Initiate the listen on the socket so remote users
* can connect. The listen backlog is set to 5, which
* is within the supported range of 1 to 20.
*/
if (listen(ls, 5) == -1) {
perror(argv[0]);
fprintf(stderr, "%s: unable to listen on socket\n", argv[0]);
close(ls);
exit(1);
}
第 15 章
75
ク ラ イ ア ン ト / サーバー サン プル プ ロ グ ラ ム
サービ ス ア ド レ スの検索に getaddrinfo() を使用する IPv6 TCP サーバー
76
第 15 章
A IPv4 か ら IPv6 への移行の
ク イ ッ ク リ フ ァ レンス ガイ ド
本ガ イ ド は、 IPv6 サポー ト のために、 ソ ース コ ー ド のシ ン ボルや関数に ど の よ う な変更が必要
か を知 り たい ソ ケ ッ ト アプ リ ケーシ ョ ン プ ロ グ ラ マ向けの も のです。
付録 A
77
IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド
既存の IPv4 間ア プ リ ケーシ ョ ンは変更する必要があ り ますか ?
既存の IPv4 間ア プ リ ケーシ ョ ンは変更する必要があ り ますか ?
いいえ。 現在の IPv4 アプ リ ケーシ ョ ンは変更す る 必要はあ り ません。 新 し い IPv6 機能を利用 し
たい場合にだけ、 アプ リ ケーシ ョ ン を修正 し て く だ さ い。
78
付録 A
IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド
要約 : ソ ース コ ー ド シ ン ボル と 関数の変更点
要約 : ソ ース コ ー ド シ ン ボル と 関数の変更点
以下の表では、 ソ ケ ッ ト アプ リ ケーシ ョ ンのプ ロ グ ラ マが IPv6 をサポー ト す る ために コー ド を
移植す る 際に注意す る 必要があ る 、 ソ ース コ ー ド シ ン ボル と 関数の変更点について示 し ます。
シ ンボル、 デー タ 構造体、 関数呼び出 し に必要な変更
表 A-1
シ ンボル、 デー タ 構造体、 関数呼び出 し に必要な変更
変更が必要な ソ ース コ ー ド
新 し い ソ ース コ ー ド
シ ン ボル
AF_INET
PF_INET
AF_INET6
PF_INET6
デー タ 構造体
sockaddr_in
u_short sin_family
in_port_t sin_port
sin_addr struct in_addr
sockaddr_in6
short
u_short
uint32_t
struct in6_addr
uint32_t
ifreq
ifconf
struct if_laddrreq
struct if_laddrconf
sin6_family;
sin6_port;
sin6_flowinfo;
sin6_addr;
sin6_scope_id
関数呼び出 し
gethostbyname()
getaddrinfo() ま たは getipnodebyname()、
freeaddrinfo()
gethostbyaddr()
getipnodebyaddr()、 getnameinfo()、
freeaddrinfo()
inet_ntoa()
inet_addr() ま たは inet_aton()
inet_ntop()
inet_pton()
付録 A
79
IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド
要約 : ソ ース コ ー ド シ ン ボル と 関数の変更点
ハー ド コ ー ド さ れたデー タ 構造体のサイ ズ
移植前のアプ リ ケーシ ョ ン で、sizeof(struct sockaddr_in) = sizeof(struct sockaddr)
= 16 であ る こ と を確認 し て く だ さ い。 IPv6 ア ド レ ス のデー タ 構造体 sockaddr_in6 は、 従来の
sockaddr_in デー タ 構造体 よ り 大 き く な っ てい ます。
マルチキ ャ ス ト および IPv4 のオプ シ ョ ン
表 A-2 マルチキ ャ ス ト および IPv4 のオプ シ ョ ン
IPv4
IPv6
IN_CLASSA
IN_CLASSB
IN_CLASSC
IN_CLASSD
な し 。 IPv6 のア ド レ ス指定は
ク ラ ス レ ス です。
コメント
ループバ ッ ク ア ド レ ス
表 A-3 ループバ ッ ク ア ド レ ス
IPv4
IPv6
コメント
INADDR_LOOPBACK
in6addr_loopback
in6adr_loopback は
in6_addr 構造体です。
ワ イル ド カ ー ド ア ド レ ス
表 A-4 ワ イル ド カ ー ド ア ド レ ス
IPv4
IPv6
コメント
INADDR_ANY
in6addr_any
in6addr_any は in6_addr
構造体です。
80
付録 A
IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド
要約 : ソ ース コ ー ド シ ン ボル と 関数の変更点
マルチキ ャ ス ト のデ フ ォ ル ト
表 A-5 マルチキ ャ ス ト のデ フ ォ ル ト
IPv4
IPv6
IP_DEFAULT_MULTICAST_LOOP
IP_DEFAULT_MULTICAST_TTL
IPV6_DEFAULT_MULTICAST_LOOP
IPV6_DEFAULT_MULTICAST_HOPS
コメント
IPv6 マルチキ ャ ス ト のオプ シ ョ ン
表 A-6 IPv6 マルチキ ャ ス ト のオプ シ ョ ン
IPv4
IPv6
IP_MULTICAST_IF
IP_MULTCAST_TTL
IP_MULTICAST_LOOP
IP_ADD_MEMBERSHIP
IP_DROP_MEMBERSHIP
IPV6_MULTICAST_IF
IPV6_MULTCAST_HOPS
IPV6_MULTICAST_LOOP
IPV6_JOIN_GROUP
IPV6_LEAVE_GROUP
注記
付録 A
コメント
getsockopt() お よ び setsockopt() の level パ ラ メ ー タ を設定す る と き は、 こ
こ に示す IPV6_* オプシ ョ ンすべてに IPPROTO_IPV6 レベルを使用 し ます。
81
IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド
要約 : ソ ース コ ー ド シ ン ボル と 関数の変更点
IP パケ ッ ト のオプ シ ョ ン
表 A-7 IP パケ ッ ト のオプ シ ョ ン
IP_OPTIONS
IPV6_PKTOPTIONS
コメント
IP_RECVDSTADDR
IP_RECVIF
IPV6_DESTOPTS
IPV6_HOPLIMIT
終点オプシ ョ ン を受信 し ます
パケ ッ ト を受信す る ためのユニ キ ャ ス ト
中継限界数です
中継点オプシ ョ ン を受信 し ます
次のホ ッ プ ア ド レ ス を設定 し ます
パケ ッ ト 情報を取得お よ び設定 し ます
あ て先 IP ア ド レ ス を取得お よ び設定 し
ます
受信 し た イ ン タ フ ェース イ ンデ ッ ク ス を
取得お よ び設定 し ます
IPV6_HOPOPTS
IPV6_NEXTHOP
IPV6_PKTINFO
IPV6_PKTINFO
IPV6_PKTINFO
IPV6_RTHDR
経路制御ヘ ッ ダーを送受信 し ます
IP_TTL
IPv6_UNICAST_HOPS
デフ ォ ル ト のユニ キ ャ ス ト 中継限界数を
設定 し ます
ip_mreq
ipv6_IP_OPTIONSmreq
注記
IPV6_PKTOPTIONS を使っ て、 上記の 7 つのオプシ ョ ン を 1 つの setsockopt()
呼び出 し にバン ド ル し ます。
サービ ス タ イ プのオプ シ ョ ン
表 A-8 サービ ス タ イ プのオプ シ ョ ン
IP_TOS
82
IETF IPng ワーキ ン グ グループで議論中です
付録 A
IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド
要約 : ソ ース コ ー ド シ ン ボル と 関数の変更点
マルチキ ャ ス ト グループ、 IP ア ド レ ス、 IPv6 イ ン タ フ ェ ース イ ンデ ッ ク ス
表 A-9 マルチキ ャ ス ト グループ、 IP ア ド レ ス、 IPv6 イ ン タ フ ェ ース イ ンデ ッ ク ス
IPv4
IPv6
コメント
struct in_addr imr_multicast
struct in6_addr
ipv6mr_multiaddr
グループのマルチキ ャ ス ト ア ド
レス
struct in_addr imr_interface
uint32
ipv6mr_interface
IPv4: イ ン タ フ ェース の ロ ーカ
ル IP ア ド レ ス
IPv6: イ ン タ フ ェース イ ンデ ッ
クス
付録 A
83
IPv4 か ら IPv6 への移行の ク イ ッ ク リ フ ァ レ ン ス ガ イ ド
要約 : ソ ース コ ー ド シ ン ボル と 関数の変更点
84
付録 A