スポンサーリンク

プログラミング

C言語でARPテーブルを表示させてみた!

投稿日:

今回はCで保持している全てのARPエントリーを取得して表示させてみました。CでARPテーブルを表示させようと思った当初、arpコマンドで出てくる情報をそのままCで表示したいと思いまいした。



そこで最初に私が思ったのは、ioctlでSIOCGARP指定して、arpreq構造体にARPテーブルの情報を格納すれば、ARPテーブルを表示出来るのではないか、と思いました。しかし、この考えがドツボにはまりました。海外のサイト含め、色々と調べてみましが、SIOCGARPを使って全てのエントリーを取得するのは無理でした。



SIOCGARPを使うときは、相手機器のIPアドレスを指定してあげると、カーネルはそれに一致するエントリーをみて、arpreq構造体にMACアドレスやフラグを格納して返してくれるそうです。つまり、IPアドレスを事前に知っている必要があります。なので今回は違うアプロ―チで、 IPアドレスの指定をしないで全てのARPエントリーを表示していきます。




実はARPテーブルは、カーネルの/proc/net/arpを参照すれば入手できます。


procディレクトリの具体的な説明は他のサイトに任せるとして、ざっくりというならprocディレクトリには、カーネルに保存されたハードウェアやネットワークに関する様々な情報が格納されています。他には/proc/cpuinfoではハードウェア情報が見れます。



ということで、まずは実際に中身を見てみます。
例えば、vim /proc/net/arp  とたたいてみて下さい。
そうすると以下ようなカーネルに保存されいるARPテーブルが見れます。



つまり、ファイルオープンで/proc/net/arpを指定して、あとはそのファイルから情報を読み取っていけば、全てのARPエントリーが手に入ります。実際には一行目はいらないので、fgets関数で読み飛ばします。



参考までに、xxdコマンドを使えば、ファイルを16進数や2進数でダンプすることが出来ます。

先ほどの/proc/net/arpを16進数でダンプした画像です。

青丸が最小の改行コードなので、fgets関数ではここまで来ます。



最後まで読んでいただきありがとうございました。

スポンサーリンク

-プログラミング

Copyright© 無線&ネットワーク屋 , 2019 All Rights Reserved Powered by STINGER.