Linux网络配置代码

Linux网络配置代码

http://blog.csdn.net/myaccella/article/details/6968753

Linux下 配置网络接口比较简单, IP地址,掩码,缺省网管用ioctl,DNS直接操作/etc/resolv.conf文件就可以了。


 

  1. void interface_configure(const char* address,  
  2.                const char* netmask,  
  3.                const char* gateway,  
  4.                const char* dns1, const char* dns2)  
  5. {  
  6.   ifreq ifr;  
  7.   sockaddr_in saddr;  
  8.   rtentry rte;  
  9.   sockaddr_in rtdst;  
  10.   sockaddr_in rtgw;  
  11.   char buffer[1024];  
  12.   
  13.   int fd = socket(AF_INET, SOCK_DGRAM, 0);  
  14.   if (fd == -1) {  
  15.     fprintf(stderr,"Failed to create socket: %s", strerror(errno));  
  16.     return;  
  17.   }  
  18.   
  19.   // Following operation eq. to 'ifconfig eth0 <address> netmask <netmask>'  
  20.   memset(&ifr, 0, sizeof(ifr));  
  21.   strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);  
  22.   
  23.   memset(&saddr, 0, sizeof(saddr));  
  24.   saddr.sin_family = AF_INET;  
  25.   inet_aton(address, &saddr.sin_addr);  
  26.   memcpy(&ifr.ifr_addr, &saddr, sizeof(saddr));  
  27.   
  28.   if (ioctl(fd, SIOCSIFADDR, &ifr) == -1) {  
  29.     fprintf(stderr, "Failed to set interface address %s: %s",  
  30.                    address, strerror(errno));  
  31.     return;  
  32.   }  
  33.     
  34.   inet_aton(netmask,  (sockaddr_in*)(&(ifr.ifr_netmask.sin_addr));  
  35.   if (ioctl(fd, SIOCSIFNETMASK, &ifr) == -1) {  
  36.     fprintf(stderr, "Failed to set interface netmask %s: %s",  
  37.                    netmask, strerror(errno));  
  38.     return;  
  39.   }  
  40.   
  41.   // route del default  
  42.   
  43.   memset(&rte, 0, sizeof(rte));  
  44.   rte.rt_flags = RTF_UP | RTF_GATEWAY;  
  45.   memset(&rtdst, 0, sizeof(rtdst));  
  46.   rtdst.sin_family = AF_INET;  
  47.   memcpy(&rte.rt_dst, &rtdst, sizeof(rtdst));  
  48.   while (1) {  
  49.     if (::ioctl(fd, SIOCDELRT, &rte) == -1) {  
  50.       if (errno != ESRCH) {  
  51.         fprintf(stderr, "Failed to delete gateway: %s", strerror(errno));  
  52.       }  
  53.       break;  
  54.     }  
  55.   }  
  56.   
  57.   // route add default gw <gatevay>  
  58.   memset(&rtgw, 0, sizeof(rtgw));  
  59.   rtgw.sin_family = AF_INET;  
  60.   inet_aton(gateway, &rtgw.sin_addr);  
  61.   memcpy(&rte.rt_gateway, &rtgw, sizeof(rtgw));  
  62.   if (ioctl(fd, SIOCADDRT, &rte) == -1) {  
  63.     fprintf(stderr, "Failed to add gateway %s: %s",  
  64.                    gateway, strerror(errno));  
  65.   }  
  66.   
  67.   close(fd);  
  68.   
  69.   // echo nameserver <dns1> > /etc/resolv.conf  
  70.   // echo nameserver <dns2> >> /etc/resolv.conf  
  71.   fd = creat("/etc/resolv.conf", 0666);  
  72.   if (fd == -1) {  
  73.     fprintf(stderr, "Failed to open  /etc/resolv.conf %s", strerror(errno));  
  74.   }  
  75.   else {  
  76.     if (dns1 != NULL) {  
  77.       snprintf(buffer, sizeof(buffer), "nameserver %s\n", dns1);  
  78.       write(fd, buffer, strlen(buffer));  
  79.     }  
  80.    
  81.     if (dns2 != NULL) {  
  82.       snprintf(buffer, sizeof(buffer), "nameserver %s\n", dns2);  
  83.       write(fd, buffer, strlen(buffer));  
  84.     }  
  85.   
  86.     close(fd);  
  87.   }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值