GATEWAY获取与设置(Linux C)


  1. #include <sys/types.h>    
  2. #include <sys/socket.h>    
  3. #include <netinet/in.h>    
  4. #include <net/if.h>    
  5. #include <sys/ioctl.h>    
  6. #include <errno.h>    
  7. #include <string.h>    
  8. #include <net/route.h>    
  9. #include <unistd.h>    
  10. #include <stdio.h>    
  11.   
  12. int set_gateway(unsigned long gw)    
  13. {    
  14.   int skfd;    
  15.   struct rtentry rt;    
  16.   int err;    
  17.   
  18.   skfd = socket(PF_INET, SOCK_DGRAM, 0);    
  19.   if (skfd < 0)    
  20.     return -1;    
  21.   
  22.   /* Delete existing defalt gateway */    
  23.   memset(&rt, 0, sizeof(rt));    
  24.   
  25.   rt.rt_dst.sa_family = AF_INET;    
  26.   ((struct sockaddr_in *)&rt.rt_dst)->sin_addr.s_addr = 0;    
  27.   
  28.   rt.rt_genmask.sa_family = AF_INET;    
  29.   ((struct sockaddr_in *)&rt.rt_genmask)->sin_addr.s_addr = 0;    
  30.   
  31.   rt.rt_flags = RTF_UP;    
  32.   
  33.   err = ioctl(skfd, SIOCDELRT, &rt);    
  34.   
  35.   if ((err == 0 || errno == ESRCH) && gw) {    
  36.   /* Set default gateway */    
  37.   memset(&rt, 0, sizeof(rt));    
  38.   
  39.   rt.rt_dst.sa_family = AF_INET;    
  40.   ((struct sockaddr_in *)&rt.rt_dst)->sin_addr.s_addr = 0;    
  41.   
  42.   rt.rt_gateway.sa_family = AF_INET;    
  43.   ((struct sockaddr_in *)&rt.rt_gateway)->sin_addr.s_addr = gw;    
  44.   
  45.   rt.rt_genmask.sa_family = AF_INET;    
  46.   ((struct sockaddr_in *)&rt.rt_genmask)- >sin_addr.s_addr = 0;    
  47.   
  48.   rt.rt_flags = RTF_UP | RTF_GATEWAY;    
  49.   
  50.   err = ioctl(skfd, SIOCADDRT, &rt);    
  51.  }    
  52.   
  53.   close(skfd);    
  54.   
  55.   return err;    
  56. }    
  57.   
  58. int get_gateway(unsigned long *p)    
  59. {    
  60.   FILE *fp;    
  61.   char buf[256]; // 128 is enough for linux    
  62.   char iface[16];    
  63.   unsigned long dest_addr, gate_addr;    
  64.   *p = INADDR_NONE;    
  65.   fp = fopen("/proc/net/route""r");    
  66.   if (fp == NULL)    
  67.     return -1;    
  68.   /* Skip title line */    
  69.   fgets(buf, sizeof(buf), fp);    
  70.   while (fgets(buf, sizeof(buf), fp)) {    
  71.     if (sscanf(buf, "%s\t%lX\t%lX", iface,       &dest_addr, &gate_addr) != 3 ||    
  72.   dest_addr != 0)    
  73.   continue;    
  74.   *p = gate_addr;    
  75.   break;    
  76.   }    
  77.   
  78.   fclose(fp);    
  79.   return 0;    
  80. }   

相关内容