2010年04月09日

C言語でIP設定

C言語からIPを設定するプログラムを書いてみた。
ifconfigのソースコードを参考にした。
http://freshmeat.net/projects/net-tools/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <unistd.h>

int setip(char* interface_name, unsigned long ip)
{
int sockfd;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in sin;
memset(&sin, 0, sizeof(struct sockaddr));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(ip);

struct ifreq ifr;
strncpy(ifr.ifr_name, interface_name, IFNAMSIZ);
memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr));

int ret;
ret = ioctl(sockfd, SIOCSIFADDR, &ifr);
if(ret == -1) {
perror("ioctl:SIOCSIFADDR");
}

close(sockfd);

return ret;
}

int setmask(char* interface_name, unsigned long ip)
{
int sockfd;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in sin;
memset(&sin, 0, sizeof(struct sockaddr));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(ip);

struct ifreq ifr;
strncpy(ifr.ifr_name, interface_name, IFNAMSIZ);
memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr));

int ret;
ret = ioctl(sockfd, SIOCSIFNETMASK, &ifr);
if(ret == -1) {
perror("ioctl:SIOCSIFNETMASK");
}

close(sockfd);

return ret;
}

int main()
{
setip("eth0:0", 0xc0a80a01); /* 192.168.10.1 */
setmask("eth0:0", 0xffffff00); /* 255.255.255.0 */

return 0;
}


IPアドレスの設定と、サブネットマスクの設定はほとんど同じコード。ioctlに渡すリクエストコードが異なるのみ。

ほかにも、SIOCSIFBRDADDRを渡せば、ブロードキャストアドレスを変更できるみたい。
posted by mypc at 22:05| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/37004386

この記事へのトラックバック