ICMPV6を使ったネットワークプログラム


ICMPV6を使ったプログラムを作ります。
作るものは以下の記事に書いたようなtracerouteをIPV6で書き直したものです。


IPv4とIPv6は仕様的に異なるところがそこそこあります。
そのためプログラムの書き方にも相違点がありIPv4で通用していた書き方ではどうにもならない部分もあります。


実装

IPv4との相違点


IPv4でプログラミングしていた時との相違点を可能な限りまとめます。

ソケット


ICMPV6パケットを送受信するためのソケットを作成します。


IPv4ではここでIPヘッダーを自分で作成したい場合、setsockoptでIP_HDRINCLを指定することによってそれを実現できます。

しかしIPv6ではIP_HDRINCLを指定できませんでした。
そもそも「IPv6ヘッダーを自分で作る」ということができないようになっているみたいです。

さらに上のようにソケットを作成しても受信するのはIPv6ヘッダーではなくICMPV6パケットです。

tracerouteはHop limit値を更新しながらパケットの送信を繰り返していくわけですが、
IPv6ヘッダーを自分作ることができないとなるとどうすればいいのか。

そこでsetsockoptを使います。


このようにHop limitを指定することができます。

アドレス情報構造体


IPv4ではパケットを送信する際にsockaddr_in構造体にアドレスファミリと宛先IPアドレスを指定してsendtoに構造体を渡します。

IPv6でもこれは同じです。
構造体がsockaddr_in6に変わっただけです。
アドレスファミリに指定するのはAF_INET6です。

アドレスの文字列からの変換はIpv4の場合と同じようにinet_ptonを使用することができます。

実行結果


実行するとこのようになります。


IPv6はまだまだ底がありそうなのでIPv4との相違点を中心に触れていきたいと思います。