您的位置:首页 > 理论基础 > 计算机网络

Linux网络配置代码

2013-09-02 19:19 127 查看
Linux网络配置代码
http://blog.csdn.net/myaccella/article/details/6968753
Linux下 配置网络接口比较简单, IP地址,掩码,缺省网管用ioctl,DNS直接操作/etc/resolv.conf文件就可以了。

void interface_configure(const char* address,
const char* netmask,
const char* gateway,
const char* dns1, const char* dns2)
{
ifreq ifr;
sockaddr_in saddr;
rtentry rte;
sockaddr_in rtdst;
sockaddr_in rtgw;
char buffer[1024];

int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1) {
fprintf(stderr,"Failed to create socket: %s", strerror(errno));
return;
}

// Following operation eq. to 'ifconfig eth0 <address> netmask <netmask>'
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);

memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
inet_aton(address, &saddr.sin_addr);
memcpy(&ifr.ifr_addr, &saddr, sizeof(saddr));

if (ioctl(fd, SIOCSIFADDR, &ifr) == -1) {
fprintf(stderr, "Failed to set interface address %s: %s",
address, strerror(errno));
return;
}

inet_aton(netmask, (sockaddr_in*)(&(ifr.ifr_netmask.sin_addr));
if (ioctl(fd, SIOCSIFNETMASK, &ifr) == -1) {
fprintf(stderr, "Failed to set interface netmask %s: %s",
netmask, strerror(errno));
return;
}

// route del default

memset(&rte, 0, sizeof(rte));
rte.rt_flags = RTF_UP | RTF_GATEWAY;
memset(&rtdst, 0, sizeof(rtdst));
rtdst.sin_family = AF_INET;
memcpy(&rte.rt_dst, &rtdst, sizeof(rtdst));
while (1) {
if (::ioctl(fd, SIOCDELRT, &rte) == -1) {
if (errno != ESRCH) {
fprintf(stderr, "Failed to delete gateway: %s", strerror(errno));
}
break;
}
}

// route add default gw <gatevay>
memset(&rtgw, 0, sizeof(rtgw));
rtgw.sin_family = AF_INET;
inet_aton(gateway, &rtgw.sin_addr);
memcpy(&rte.rt_gateway, &rtgw, sizeof(rtgw));
if (ioctl(fd, SIOCADDRT, &rte) == -1) {
fprintf(stderr, "Failed to add gateway %s: %s",
gateway, strerror(errno));
}

close(fd);

// echo nameserver <dns1> > /etc/resolv.conf
// echo nameserver <dns2> >> /etc/resolv.conf
fd = creat("/etc/resolv.conf", 0666);
if (fd == -1) {
fprintf(stderr, "Failed to open /etc/resolv.conf %s", strerror(errno));
}
else {
if (dns1 != NULL) {
snprintf(buffer, sizeof(buffer), "nameserver %s\n", dns1);
write(fd, buffer, strlen(buffer));
}

if (dns2 != NULL) {
snprintf(buffer, sizeof(buffer), "nameserver %s\n", dns2);
write(fd, buffer, strlen(buffer));
}

close(fd);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: