IPv6プログラミング
IPv6プログラミング
055756B 松川梓
実験環境
機種:iBookG4
OS:Mac OS X ver 10.4.8
CPU:1.33GHz PowerPC G4
メモリ:768MB DDR SDRAM
コンパイラ:gcc version 4.0.1
課題1
tcpv6cはIPv4とIPv6の両方に対応しているにもかかわらず、tcpc(IPv4のみに対応)よりコードが短い。この理由は何故か説明せよ。(ヒント:両プログラムのアドレスとポート番号の変換処理部分に着目せよ)
tcpc.c
tcpv6c.c
tcpc.cとtcpv6.cで使われている関数は
tcpc.c
inetaddr()関数:インターネットホストのアドレスを「数値とドット」記法からバイナリ値へ変換して返す.
gethostbyname()関数:与えられたホスト名に対応する構造体を返す.
atoi()関数:nptrによって指示される文字列のはじめの部分をint型に変換する.
getservbyname()関数:プロトコルを用いるサービスの名前にマッチする行を/etc/servicesから探し、その行の内容を含めたservent構造体を返す.
tcpv6.c
getaddrinfo()関数:getaddinfo()関数はgetipnodebyname(),Getipnodebyaddr(),getservbyname(),Getservbyport()の4つの関数の機能をまとめて1つのインターフェースにしたものである.なのでgetaddinfo()関数のみでネットワークホストのアドレスを取得でき、さらにポート番号も調べることができる.
tcpv6c.cで使われているgetaddrinfo()関数は、tcpc.cで使われているgethostbyname()関数、getservbyname()関数という二つの関数の機能をまとめたものである。このgetaddrinfo関数は、IPv4アドレス構造体だけではなく、IPv6のサポートされているシステムならIPv6のソケットアドレス構造体を生成することもできる。
このように、getaddrinfo関数を使うことにより、IPv4、IPv6両方に対応し、より簡潔にプログラムを記述することができる。
課題2
tcpv6sはAF_INET6でソケットをオープンしているにもかかわらず、IPv4でも通信できる。この理由は何故か説明せよ。(ヒント:IPv6アドレスとIPv4アドレスの互換性に着目せよ)
IPv6アドレスにはIPv4マップアドレスと呼ばれるIPv6アドレスがある。これは上位80ビットに0、次の上位16ビットに1、残りの32ビットにIPv4アドレスを埋め込んだら、
::ffff:a.b.c.d
のように表せる。
このアドレスを利用すると、IPv4ノードとIPv6ノードの両方と通信する際に、同じアドレスデータ構造と、さらには同じソケットを使用できる。このため、tcpv6sはAF_INET6でソケットをオープンしているにもかかわらず、IPv4でも通信できる。
また、AF_INET6はIPv4にもIPv6にも対応できるものである。
課題3
サンプルプログラム(2)のクライアント(tcpc2.c)とサーバ(tcps2.c)をアドレスファミリ独立となるように書き換えよ。
このプログラムは、以下のようにIPv4に依存した部分が幾つもハードコーディングされている。
・inet_ntopがハードコーディングされたAF_INETと一緒に使われている。
・gethostbynameが使われている。
・sockaddr_inが使われている。
・hbufがIPv4アドレスの最大文字数長分(INET_ADDRSTRLEN)になっている。
・socket関数がSOCK_STREAMにIPPROTO_TCPをハードコーディングしている。
・socket関数がハードコーディングされたAF_INETを使っている。
以上の点に注意して、アドレスファミリ独立のプログラムに書き換えること。
書き換えたプログラムは
tcpc2_1.c
tcpc2_1.c
実行結果
[nw0556:~/jikken2/report7@nagata/tcpv6c2] j05056% 133.13.59.56 8000
trying 133.13.59.56 port 3221224187
Hello ::ffff:133.13.59.56
[nw0556:~/jikken2/report7@nagata/tcpv6c2] j05056% 2001:02f8:001c:d048:0211:24ff:fe90:3b55 8000
trying 2001:2f8:1c:d048:211:24ff:fe90:3b55 port 3221224158
Hello 2001:2f8:1c:d048:211:24ff:fe90:3b55
参考URL
HTMLリファレンス(http://www.tohoho-web.com/html/index.htm)
日本hpテクニカルドキュメント(http://welcome.hp.com/country/jp/ja/welcome.html)