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)