随分と古い情報になりますが、Linux (Fedora6) で IP アドレスとの追加と削除を行うサンプルプログラムを本ページでは掲載しています。
スポンサーリンク
IP アドレスの追加と削除
このサンプルでは、IP アドレスの削除を SIOCSIFADDR と IP アドレス(0.0.0.0)を ioctl 関数に渡すことで実現していますが、本来は SIOCDIFADDR で IP アドレスが削除されると思われます。(Fedora6 では未実装ではないかと思います)
#include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> char* devname = "eth0:9"; // 追加するデバイス名(適当) struct in_addr addIPaddr; struct in_addr addMask; /* エイリアスIPアドレスを追加する */ int addipalias() { struct ifreq ifr; int s = -1; struct sockaddr_in sin; if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ perror("socket"); return -1; } memset(&ifr, 0, sizeof (ifr)); strncpy(ifr.ifr_name, devname, 16); sin.sin_family=AF_INET; sin.sin_addr = addIPaddr; memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr)); /* IP アドレスを追加 */ if (ioctl(s, SIOCSIFADDR, &ifr) < 0) { perror("ioctl(SIOCSIFADDR)"); return -1; } /* サブネットマスクを追加 */ sin.sin_addr = addMask; memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr)); if (ioctl(s, SIOCSIFNETMASK, &ifr) < 0) { perror("ioctl(SIOCSIFNETMASK)"); return -1; } close(s); } /* エイリアスIPアドレスを削除する */ int delipalias() { struct ifreq ifr; int s; struct sockaddr_in sin; if( (s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { return -1; } memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, devname, 16); sin.sin_family=AF_INET; sin.sin_addr.s_addr = inet_addr("0.0.0.0"); memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr)); // Fedora6 では SIOCDIFADDR を使って削除ができない様子 // 未実装か?それとも他に理由があるか? if (ioctl(s, SIOCSIFADDR, &ifr) < 0) { perror("ioctl"); return -1; } close(s); } int main() { addIPaddr.s_addr = inet_addr("10.66.34.100"); // 追加するIPアドレス addMask.s_addr = inet_addr("255.255.0.0"); // 追加するIPアドレスのサブネットマスク // IP アドレスを追加 addipalias(); // 追加した IP アドレスを削除 delipalias(); return 0; }