MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

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

投稿日:2019年7月18日 更新日:


今回はCで保持している全ての

ARPエントリーを取得して表示させてみました。



CでARPテーブルを表示させようと思った当初、

arpコマンドで出てくる情報を

そのままCで実装したいと思いまいした。



そこで最初に私が思ったのは、

ioctlでSIOCGIFARP指定して、

arpreq構造体にARPテーブルの情報を格納すれば、

ARPテーブルを表示出来るのではないかと思いました。



しかし、この考えがドツボにはまりました。

海外のサイト含め、色々と調べてみましが、

SIOCGARPを使って全ての

エントリーを取得するのは無理でした。



SIOCGIFARPを使うときは、

相手のIPアドレスを指定する必要があります。



カーネルはその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関数ではここまで来ます。




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




IPv6アドレスを同じようにファイルから取得する方法:
https://wireless-network.net/ipv6-get-c/

-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.