随分と古い情報になりますが、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;
}