euniclusICMPV6を使ったプログラムを作ります。作るものは以下の記事に書いたようなtracerouteをIPV6で書き直したものです。ターゲットマシンとの間にあるルーターのIPアドレスを取得するIPv4とIPv6は仕様的に異なるところがそこそこあります。そのためプログラムの書き方にも相違点がありIPv4で通用していた書き方ではどうにもならない部分もあります。0;}IPv4との相違点IPv4でプログラミングしていた時との相違点を可能な限りまとめます。ソケットICMPV6パケットを送受信するためのソケットを作成します。IPPROTO_ICMPV6)IPv4ではここでIPヘッダーを自分で作成したい場合、setsockoptでIP_HDRINCLを指定することによってそれを実現できます。IPv6ではIP_HDRINCLを指定できませんでした。そもそも「IPv6ヘッダーを自分で作る」ということができないようになっているみたいです。上のようにソケットを作成しても受信するのはIPv6ヘッダーではなくICMPV6パケットです。limit値を更新しながらパケットの送信を繰り返していくわけですが、IPv6ヘッダーを自分作ることができないとなるとどうすればいいのか。そこでsetsockoptを使います。limitを指定することができます。アドレス情報構造体IPv4ではパケットを送信する際にsockaddr_in構造体にアドレスファミリと宛先IPアドレスを指定してsendtoに構造体を渡します。IPv6でもこれは同じです。構造体がsockaddr_in6に変わっただけです。アドレスファミリに指定するのはAF_INET6です。アドレスの文字列からの変換はIpv4の場合と同じようにinet_ptonを使用することができます。実行するとこのようになります。2001:db8:0:3:f8b9:c0da:6aa8:e5c9IPv6はまだまだ底がありそうなのでIPv4との相違点を中心に触れていきたいと思います。