ネットワークインターフェース名一覧を取得する
ネットワークプログラミングを行っていると、自分のネットワークインターフェース(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してしまっても大丈夫です。 もちろん、ソケットをそのまま使い続ける事も可能です。