課題1
課題2
課題3
参考文献
■課題1: tcpv6cはIPv4とIPv6の両方に対応しているにもかかわらず、tcpc(IPv4のみに対応)よりコードが短い。 この理由は何故か説明せよ。(ヒント:両プログラムのアドレスとポート番号の変換処理部分に着目せよ) tcpv6c.c では getaddrinfo() という関数を使用することでコードを短くしている。 tcpv6c.c getaddrinfo() 関数は、 getipnodebyname(), getipnodebyaddr(), ネットワークホストの名前とアドレスの取得 getservbyname(),getservbyport(), サービスのエントリを取得する の4つの関数の機能をまとめて一つのインターフェースにしたものである。 tcpc.c inet_addr() インターネットアドレス操作ルーチン gethostbyname() ネットワーク上のホストのエントリを取得する atoi() 文字列を整数型に変換する getservbyname() サービスのエントリを取得する ntohs() ホストバイトオーダーとネットワークバイトオーダーの間で値を変換する ■課題2: tcpv6sはAF_INET6でソケットをオープンしているにもかかわらず、IPv4でも通信できる。 この理由は何故か説明せよ。(ヒント:IPv6アドレスとIPv4アドレスの互換性に着目せよ) IPv6アドレス体系の中には、IPv4射影アドレスと呼ばれるIPv6アドレスが存在する。 IPv4射影アドレスはIPv6をサポートしていないノードのIPv4アドレスをIPv6アドレスとして塀するために使用される。 具体的には、上位80ビットに0、81〜96ビット目に1、下位32ビットにIPv4アドレスが埋め込まれる。 [例] ::ffff:10.1.2.3 これにより、IPv4しかサポートしないホストとIPv6ホストが通信する事ができる。 ■課題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と一緒に使われている。 以上の点に注意して、アドレスファミリ独立のプログラムに書き換えること。 書き換えたプログラム tcpc2_1.c tcps2_1.c 参考文献 JM Project http://www.linux.or.jp/JM/