Osamu Sayama's Weblog

木曜日 8 28, 2008

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 対応だとケース分けとかラッパーが必要になってしまうインターフェースです。。。

投稿されたコメント:

コメント
  • HTML文法 不許可

Calendar

Feeds

Search

Links

Navigation

Referrers