ネットワークインターフェース名一覧を取得する

ネットワークプログラミングを行っていると、自分のネットワークインターフェース(NIC)一覧が欲しくなります。 ここでは、Mac OS Xでen0、eth1などのネットワークインターフェース名一覧を取得する方法を説明します。

単純なネットワークインターフェース一覧取得プログラム

Mac OS Xでの簡単なネットワークインターフェース一覧取得プログラムのサンプルを以下に示します。


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <sys/ioctl.h>

/* 取得できるインターフェースの最大値 */
/* 10個以上インターフェースがある場合は増やしてください */
#define MAX_IFR 10

int
main()
{
  struct ifreq ifr[MAX_IFR];
  struct ifconf ifc;
  int fd;
  int nifs, i;

  fd = socket(AF_INET, SOCK_DGRAM, 0);

  /* データを受け取る部分の長さ */
  ifc.ifc_len = sizeof(ifr);

  /* kernelからデータを受け取る部分を指定 */
  ifc.ifc_ifcu.ifcu_buf = (void *)ifr;

  ioctl(fd, SIOCGIFCONF, &ifc);

  /* kernelから帰ってきた数を計算 */
  nifs = ifc.ifc_len / sizeof(struct ifreq);

  /* 全てのインターフェース名を表示 */
  for (i=0; i<nifs; i++) {
    printf("%s\n", ifr[i].ifr_name);
  }

  close(fd);

  return 0;
}


Mac OS Xでは、ネットワークインターフェースリストを取得するためにioctlを利用します。 ioctlを使用するにはソケットを開く必要があります。 作るソケットはAF_INETであればTCP(SOCK_STREAM)でもUDP(SOCK_DGRAM)でもかまいません。 このサンプルではUDPのソケットを利用しています。

ネットワークインターフェース一覧を取得するために開いたソケットは、リストの取得とともにcloseしてしまっても大丈夫です。 もちろん、ソケットをそのまま使い続ける事も可能です。