インターフェースをdown状態にする

ここでは、Mac OS Xでネットワークインターフェースをdown状態にする方法を説明します。

インターフェースをdown状態にするプログラム

このサンプルを実行するとネットワークインターフェースが通信不能になるのでご注意下さい。 このサンプルはネットワークインターフェースの状態を変更できる権限(rootなど)を持ったユーザとして実行しないと失敗します。 「ifconfig en0 up」コマンドを実行するとネットワークインターフェースはup状態になります。


#include <stdio.h>

#include <string.h> /* for strncpy */

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

int
main()
{
 int fd;
 struct ifreq ifr;

 fd = socket(AF_INET, SOCK_DGRAM, 0);

 /* インターフェースを指定 */
 strncpy(ifr.ifr_name, "en0", IFNAMSIZ-1);

 /* 現在の状態を取得 */
 if (ioctl(fd, SIOCGIFFLAGS, &ifr) != 0) {
   perror("ioctl");
 }

 /* 現在の状態からIFF_UPをOFFに */
 ifr.ifr_flags &= ~IFF_UP;

 /* 状態を変更 */
 if (ioctl(fd, SIOCSIFFLAGS, &ifr) != 0) {
   /* 失敗したら理由を表示 */
   perror("ioctl");
 }

 close(fd);

 return 0;
}

このサンプルのポイントは、一度kernelが持っている状態を取得しておいて、IFF_UPの部分だけ変更していることです。 SIOCGIFFLAGSをしないでSIOCSIFFLAGSを使ってしまうと、場合によっては変えたくないパラメータまで変わってしまいます。

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

開いたソケットは、状態の変更とともにcloseしてしまっても大丈夫です。 もちろん、ソケットをそのまま使い続ける事も可能です。