euniclus今回はネットワークとプログラミング両方の学習に役立つ簡単なtracerouteを実装します。ネットワークプログラミングのいい勉強になりますし、そこそこ格好いいのでいろいろと意味があると思います。このツールを利用すると通信先マシンへの経路上にあるマシンのIPアドレスなどの情報を取得することができます。原理をまとめそれを実装してパケットがどのようにネットワークを移動するのか見ていきます。中を覗いてみるとそこそこ面倒なことをやっているようです。インターネットのどこかのマシンと通信する際は直接そのマシンとやり取りしているわけではなく、ルーターを経由してパケットを送りあっています。通信先との間にルーターがあるわけですが何台あるかはわかりません。limit)という寿命のようなものがあります。liveというのは簡単に言うとルーターを何台超えることができるかを定めた値です。liveが3だとするとこのパケットは対象のマシンへと到達する前に破棄されてしまいます。liveが3であるため3回しかルーターを超えることができないからです。liveはデクリメントされていきます。ゼロになるとTimeExceededを知らせるICMPパケットが送信者に向けて返却されます。ルートスキャンというものはこの原理を利用しています。Exceededを知らせるICMPパケットが送信者に向けて返却されると書きました。このICMPパケットにはICMPパケットを発行したルーターのIPアドレスが格納されています。liveを1にすれば、自分のマシンの、一つ先のマシンの情報が取得できるということです。liveを2に設定して、通信したい相手へとパケットを送信します。すると2つ先のマシンがICMPパケットを返却してきます。liveが2だから)そして2つ先のマシンの情報も取得できます。liveをインクリメントして繰り返すのです。することで、ルート上のマシンの情報が取得できるということです。冷静になって実装します。ソケットを作成する部分です。今回はicmpパケットを送受信します。これといったことはやっていません。ソケットの作成に成功したらディスクリプタを、失敗したら-1を返却します。soc;}次は早速送受信です。ipヘッダーとicmpヘッダーに諸々値を設定します。requestパケットを送信するためicmp_typeにICMP_ECHOを設定します。replyが返却されます。その解析をanalyze関数にお任せします。exceededが返却された場合0、それ以外は一応2を返却します。analyze関数から「1」が返却された場合は最終目標に到達したわけですから、パケット送信ループを抜けます。liveをインクリメントして送信処理を続行します。{break;}}}ソースコード最終的にこのようなプログラムになります。