[ Linux C言語 ] IP アドレスの追加と削除 ( SIOCSIFADDR / SIOCDIFADDR )

Pocket

随分と古い情報になりますが、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;
}
スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>