IPv6プログラミング
055745F:仲本拡
提出日:2006/12/18

目的
 本実験テーマ「IPv6プログラミング」では、現在、インターネットアプリケーションで用いられるアドレスプロトコルの中核であるIPv4の後継プロトコル「IPv6」について、その概要を理解するとともに、従来のIPv4との共存、および、スムーズな移行のための、IPv4/IPvデュアルスタックプログラミングについて、基本的な実装技術を身につけることを目的とする。


課題1
 tcpv6cはIPv4とIPv6の両方に対応しているにもかかわらず、tcpc(IPv4のみに対応)よりコードが短い。この理由は何故か説明せよ。(ヒント:両プログラムのアドレスとポート番号の変換処理部分に着目せよ)

 tcpcでは、gethostbyname()やinet_addr()等の、いくつかの関数で備えている機能を、tcpv6cでは、getaddrinfo()関数一つで、備えている。故に、コードが短い。


課題2
 tcpv6sはAF_INET6でソケットをオープンしているにもかかわらず、IPv4でも通信できる。この理由は何故か説明せよ。(ヒント:IPv6アドレスとIPv4アドレスの互換性に着目せよ)

 IPv6は、16進数の32桁で表示される。それに対し、IPv4は、2進数の32桁で表示される。
 本来なら、この2つは、通信不可能である筈だが、IPv4互換アドレスやIPv4射影アドレスなどを使って下位32ビットにIPv4のアドレスを埋め込むことでIPv4にも対応している。


課題3
 サンプルプログラム(2)のクライアント(tcpc2.c)とサーバ(tcps2.c)をアドレスファミリ独立となるように書き換えよ。(ヒント:下記参照)
このプログラムは、以下のようにIPv4に依存した部分が幾つもハードコーディングされている。
• sockaddr_inが使われている。
• hbufがIPv4アドレスの最大文字数長分(INET_ADDRSTRLEN)になっている。
• gethostbynameが使われている。
• socket関数がハードコーディングされたAF_INETを使っている。
• socket関数がSOCK_STREAMにIPPROTO_TCPをハードコーディングしている。
• inet_ntopがハードコーディングされたAF_INETと一緒に使われている。
以上の点に注意して、アドレスファミリ独立のプログラムに書き換えること。

client4.c
server4.c

実行結果
[SEED-tcp4]> server4 1332
[SEED-tcp4]> client4 nw0545.st.ie.u-ryukyu.ac.jp 1332
trying 133.13.59.45 port 1332
Hello ::ffff:133.13.59.45
[SEED-tcp4]> client4 133.13.59.45 1332
trying 133.13.59.45 port 1332
Hello ::ffff:133.13.59.45
[SEED-tcp4]> client4 ::ffff:133.13.59.45 1332
trying 133.13.59.45 port 1332
Hello ::ffff:133.13.59.45