MasaのITC Life

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

プログラミング

【C言語】ioctlでIPアドレスの取得・書き換え方法

投稿日:2020年2月20日 更新日:



今回はcでIPアドレスを取得し、

変更までする方法をご紹介します。



NICの情報を操作するには、

ioctlシステムコールを使います。



ioctlをコールするときに、

フラグを引数に指定します。



指定したフラグによって、

操作する情報とその情報をどうするか、

の2点が変わってきます。



IPアドレスの取得には以下のフラグを使います。




SIOCGIFADDR
:

指定したインターフェースのIPアドレスを

取得し、その情報をifreq構造体の

ifr_addrメンバに格納する。



SIOCSIFADDR :


ifreq構造体のifr_addrメンバに格納された情報を

指定したインターフェースのIPアドレスとして

書き込む(更新する)。




コードはこちらになります。



最初にIPアドレスを取得し、

それを標準出力したときに

見やすいように変換しています。

そして最後にIPアドレスを書き換えています。



キャストや似た名前があるので、

どの構造体、どの型の変数を扱っているのか

気を付けて下さい。



sockaddr_in構造体は、IPアドレスの変換、

そして書き換えの際に必要になります。



まずは ifconfig で実行前の状態を確認します。



このようになっています。

IPアドレス : 10.24.94.41

サブネットマスク: 255.255.240.0

ブロードキャストアドレス : 10.24.95.255




それでは、IPアドレスをプログラムで取得し、

プログラムから書き換えてみます。



変更後のIPアドレスは、

10.24.94.100 を指定しました。




ifconfigで実行後の状態を確認します。




IPアドレスはしっかり変更出来ました。

ところがどうでしょうか。

サブネットマスク、ブロードキャストアドレス

この2つのアドレスは、

255.0.0.0 と 10.255.255.255になってしまいました。



どうやらIPアドレスを書き換えたら、

サブネットマスクとブロードキャストアドレス

これらの変更も必要になってきます。


Cのioctlでサブネットマスクとブロードキャストアドレスを変更する方法



ioctlに指定するフラグはこちらです。


SIOCSIFBRDADDR :


ifreq構造体のifr_broadaddrメンバに格納された情報を

指定したインターフェースの

ブロードキャストアドレスとして書き込む(更新する)。



SIOCSIFNETMASK :


ifreq構造体のifr_netmaskメンバに格納された情報を

指定したインターフェースのサブネットマスクとして

書き込む(更新する)。




以下のコードを最後に追加します。





これを実行するとこのようになります。




ifconfig で再度、確認してみます。

ばっちり書き換えれていますね。

サブネットマスクもブロードキャストアドレスも

元々のアドレスと同じになりました。



以上です。IPアドレスの取得と書き換えは

以外と簡単だったことが分かったかと思います。




Cを用いたMACアドレスの書き換え方法:
https://wireless-network.net/macaddr-change/




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


-プログラミング

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