Osamu Sayama's Weblog
network interface
システムのネットワークインターフェースを取得するとき、IPv4 だと ioctl で SIOCGIFCONF で取得することができます。ただ、これだと struct ifreq が IPv4 に依存しているので IPv6 のインターフェースも取得できません。調べてみると SIOCGLIFCONF や struct lifreq なる L つきのインターフェースで IPv6 のアドレスも取得できるようです。こちらだと struct sockaddr_storage で lifru_addr も扱えるので IPv6 アドレスも扱えるようです。でさっそくサンプルはないかと OpenSolaris のソースブラウザからサーチしてみました。
いっぱいでてきますね。ifconfig.c のが参考にしながら無事にシステムのインターフェースを取得するプログラムができました。ポイントは SIOCGLIFNUM でインターフェース数を求め、SIOCGLIFCONF でインターフェースのアドレスを取得したあとはいったん socket を close し、さらに情報を取得するにはそのインターフェースのアドレスファミリーで socket を open すればよいようです。これがサンプルで、cc getinterface.c -lsocket -lnsl でコンパイルした実行結果です。やはりこのへんはソースがみれるようになっていると参考にできて便利ですね。。
%./a.out
ifname(AF_INET) = lo0
addr=127.0.0.1
netmask=255.0.0.0
ifname(AF_INET) = iprb0
addr=192.168.180.14
netmask=255.255.255.0
broad=192.168.180.255
ifname(AF_INET6) = lo0
addr=::1
netmask=ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
ifname(AF_INET6) = iprb0
addr=fe80::20e:cff:fe3b:852e
netmask=ffc0::
ちなみ SIOCGIFCONF は Solaris/Linux 共通なのですが、L つきのインタフェースは Solaris 固有で Linux とかだと getifaddrs() を使うようで、Multi platform 対応だとケース分けとかラッパーが必要になってしまうインターフェースです。。。
Posted at 10:19午後 8 28, 2008 by sayama in Solaris x86 | 投稿されたコメント[0]