MasaのITC Life

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

プログラミング

ioctlでインターフェースの状態を取得し表示させてみた(ソケットプログラミング)

投稿日:2019年5月27日 更新日:

ifconfigコマンドでインターフェースの状態などが確認できます。そこで今回、プログラムを通してインターフェースの状態を取得してみます。

ifconfigでは、flagの値と何がONになっているのかが分かるので、プログラムでも同じものを情報を表示させていきます。


まずはインターフェースの現在の状態を取得するために、ioctlのSIOCGIFFLAGSを使います。ioctlは、ネットワークインターフェースの制御をしたりするシステムコールです。また、ioctlを使うにはソケットを開くことと、取得した情報の格納先であるifreq構造体が必要です。取得したインターフェースの状態はioctlによって、ifreq構造体のifr_flagsメンバに格納されます。


このとき得られるにはフラグ値です。このフラグ値は各モードのON/OFFを示すビット単位の値です。例えば、flags = 14が得られたとします。ここで二進数表記にすると1110なので、左から1~3桁目に該当するモードがONになっていることを意味します。


フラグ値が得られたら、ビットが1になっているモードをprintfで表示させます。





もしインターフェースの任意のモードのON/OFFを切り替える場合は、ソース中の//----------で囲ってあるところで変更できます。インターフェースの状態を取得・表示させるだけなら、//---------の中身は必要ありません。


インタフェースの状態を変更する場合は、まずはifreqのメンバのifr_flagsの値を書き換えます。例えばこのとき、プロミスキャスモード のビットだけを1もしくは0にするようにします。値を書き換えたら、ioctlのSIOCSIFFLAGSを使って、ifreqのifr_flagsをインターフェースの状態に反映させます。これだけで変更は可能です。

コメントアウトで十六進数表記してあるのは、各モードが対応するビット桁です。

実行結果とifconfigを見比べてみると、しっかりとインターフェースの状態を取得出来ているのが確認できます。


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

-プログラミング

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