linux下C语言实现静态IP地址,网关的设置

来源:互联网 发布:ucloud云计算 演讲 编辑:程序博客网 时间:2024/05/29 12:13

linux下C语言实现静态IP地址,网关的设置

  1. #include <sys/ioctl.h>  
  2. #include <sys/types.h>  
  3. #include <sys/socket.h>  
  4. #include <netinet/in.h>  
  5. #include <arpa/inet.h>  
  6. #include <net/if.h>  
  7. #include <error.h>  
  8. #include <net/route.h>  
  9.   
  10. int SetIfAddr(char *ifname, char *Ipaddr, char *mask,char *gateway)  
  11. {  
  12.     int fd;  
  13.     int rc;  
  14.     struct ifreq ifr;   
  15.     struct sockaddr_in *sin;  
  16.     struct rtentry  rt;  
  17.   
  18.     fd = socket(AF_INET, SOCK_DGRAM, 0);  
  19.     if(fd < 0)  
  20.     {  
  21.             perror("socket   error");       
  22.             return -1;       
  23.     }  
  24.     memset(&ifr,0,sizeof(ifr));   
  25.     strcpy(ifr.ifr_name,ifname);   
  26.     sin = (struct sockaddr_in*)&ifr.ifr_addr;       
  27.     sin->sin_family = AF_INET;       
  28.     //IP地址  
  29.     if(inet_aton(Ipaddr,&(sin->sin_addr)) < 0)     
  30.     {       
  31.         perror("inet_aton   error");       
  32.         return -2;       
  33.     }      
  34.   
  35.     if(ioctl(fd,SIOCSIFADDR,&ifr) < 0)     
  36.     {       
  37.         perror("ioctl   SIOCSIFADDR   error");       
  38.         return -3;       
  39.     }  
  40.     //子网掩码  
  41.     if(inet_aton(mask,&(sin->sin_addr)) < 0)     
  42.     {       
  43.         perror("inet_pton   error");       
  44.         return -4;       
  45.     }      
  46.     if(ioctl(fd, SIOCSIFNETMASK, &ifr) < 0)  
  47.     {  
  48.         perror("ioctl");  
  49.         return -5;  
  50.     }  
  51.     //网关  
  52.     memset(&rt, 0, sizeof(struct rtentry));  
  53.     memset(sin, 0, sizeof(struct sockaddr_in));  
  54.     sin->sin_family = AF_INET;  
  55.     sin->sin_port = 0;  
  56.     if(inet_aton(gateway, &sin->sin_addr)<0)  
  57.     {  
  58.        printf ( "inet_aton error\n" );  
  59.     }  
  60.     memcpy ( &rt.rt_gateway, sin, sizeof(struct sockaddr_in));  
  61.     ((struct sockaddr_in *)&rt.rt_dst)->sin_family=AF_INET;  
  62.     ((struct sockaddr_in *)&rt.rt_genmask)->sin_family=AF_INET;  
  63.     rt.rt_flags = RTF_GATEWAY;  
  64.     if (ioctl(fd, SIOCADDRT, &rt)<0)  
  65.     {  
  66.         zError( "ioctl(SIOCADDRT) error in set_default_route\n");  
  67.         close(fd);  
  68.         return -1;  
  69.     }  
  70.     close(fd);  
  71.     return rc;  
  72. }  
0 0