LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2776|回复: 4

自己写了个ifconfig玩

[复制链接]
发表于 2006-4-24 13:46:52 | 显示全部楼层 |阅读模式
功能简单,就是为了前边提的“如何察看网卡信息?”而进行的学习
可用的命令:
myifconfig
myifconfig all
myifconfig eth0
myifconfig eth0 set
myifconfig eth0 up
myifconfig eth0 down
有很多毛病,比如说当一个网卡没有被配制IP的时候会出现错误


  1. #include <sys/ioctl.h>
  2. #include <net/if.h>
  3. #include <sys/socket.h>
  4. #include <sys/types.h>
  5. #include <stdio.h>
  6. #include <netinet/in.h>

  7. int info_list(int all);

  8. int get_interface_info(char * interface_name);
  9. int set_interface(char * interface_name);

  10. int get_ipaddr(char * interface_name);
  11. int get_mac(char * interface_name);
  12. int get_netmask(char * interface_name);
  13. int get_broadcast(char * interface_name);
  14. int set_ipaddr(char * interface_name,char * ip);
  15. int set_mac(char * interface_name,char * mac);
  16. int set_netmask(char * interface_name,char * netmask);
  17. int set_broadcast(char * interface_name,char * broadcast);

  18. int interface_up(char * interface_name);
  19. int interface_down(char * interface_name);

  20. int usage();


  21. int main(int argc,char * argv[])
  22. {
  23.    if(argc == 1)
  24.    {
  25.       info_list(0);
  26.       return 0;
  27.    }

  28.    if(argc == 2)
  29.    {
  30.       if(strcmp(argv[1],"all") == 0)
  31.       {
  32.           info_list(1);
  33.           return 0;
  34.       }

  35.       get_interface_info(argv[1]);

  36.       return 0;
  37.    }

  38.    if(argc == 3)
  39.    {
  40.       if(strcmp(argv[2],"set") == 0)
  41.       {
  42.           set_interface(argv[1]);
  43.           return 0;
  44.       }
  45.       if(strcmp(argv[2],"up") == 0)
  46.       {
  47.           interface_up(argv[1]);
  48.           return 0;
  49.       }
  50.       if(strcmp(argv[2],"down") == 0)
  51.       {
  52.           interface_down(argv[1]);
  53.           return 0;
  54.       }

  55.       usage();

  56.       return 0;
  57.    }

  58.    usage();

  59.    return 0;
  60. }


  61. int info_list(int all)
  62. {  
  63.    int len;
  64.    char *ifreq_pointer;
  65.    len = 10*sizeof(struct ifreq);
  66.    ifreq_pointer = (char *)malloc(len);

  67.    struct ifconf get_info;
  68.    get_info.ifc_len = len;
  69.    get_info.ifc_ifcu.ifcu_buf = ifreq_pointer;

  70.    int sockfd;
  71.    sockfd = socket(PF_INET,SOCK_STREAM,0);
  72.    ioctl(sockfd,SIOCGIFCONF,&get_info);

  73.    int count;
  74.    count = get_info.ifc_len / sizeof(struct ifreq);
  75.    
  76.    struct sockaddr_in * return_sockaddr;

  77.    struct ifreq * result = (struct ifreq *)ifreq_pointer;
  78.    int i = 0;
  79.    if(all == 1)
  80.    for(i;i<count;i++)
  81.    {
  82.        printf("%s\n",result[i].ifr_name);
  83.        get_ipaddr(result[i].ifr_name);
  84.        get_mac(result[i].ifr_name);
  85.        get_netmask(result[i].ifr_name);
  86.        get_broadcast(result[i].ifr_name);
  87.    }
  88.    else
  89.    {
  90.        struct ifreq tmp;
  91.        int s;
  92.        if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  93.        {
  94.           perror("Socket");
  95.           exit(-1);
  96.        }

  97.        for(i;i<count;i++)
  98.        {
  99.           strcpy(tmp.ifr_name,result[i].ifr_name);
  100.           if(ioctl(s,SIOCGIFFLAGS,&tmp) < 0)
  101.           {
  102.               perror("ioctl");
  103.               exit(-1);
  104.           }
  105.           if((tmp.ifr_ifru.ifru_flags & IFF_UP) == 0)
  106.               continue;
  107.           printf("%s\n",tmp.ifr_name);
  108.           get_ipaddr(tmp.ifr_name);
  109.           get_mac(tmp.ifr_name);
  110.           get_netmask(tmp.ifr_name);
  111.           get_broadcast(tmp.ifr_name);         
  112.        }
  113.    }

  114.    exit(0);
  115. }

  116. int get_ipaddr(char * interface_name)
  117. {
  118.     int s;
  119.     if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  120.     {
  121.        perror("Socket");
  122.        return -1;
  123.     }

  124.     struct ifreq ifr;
  125.     strcpy(ifr.ifr_name,interface_name);

  126.     if(ioctl(s,SIOCGIFADDR,&ifr) < 0)
  127.     {
  128.        perror("ioctl");
  129.        return -1;
  130.     }

  131.     struct sockaddr_in * ptr;
  132.     ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_addr;

  133.     printf("        IP:%s\n",inet_ntoa(ptr->sin_addr));

  134.     return 0;
  135. }


  136. int get_mac(char * interface_name)
  137. {   
  138.     if(strcmp(interface_name,"lo") == 0)
  139.     {
  140.         return 0;
  141.     }

  142.     int s;
  143.    
  144.     if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  145.     {
  146.         perror("Socket");
  147.         return -1;
  148.     }

  149.     struct ifreq ifr;
  150.    
  151.     strcpy(ifr.ifr_name,interface_name);

  152.     if(ioctl(s,SIOCGIFHWADDR,&ifr) != 0)
  153.     {
  154.         perror("ioctl");
  155.         return -1;
  156.     }

  157.     u_char * ptr;
  158.     ptr =(u_char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
  159.     printf("        MAC:%02x-%02x-%02x-%02x-%02x-%02x\n",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));
  160.    
  161.     return 0;
  162. }


  163. int get_netmask(char * interface_name)
  164. {
  165.     int s;
  166.    
  167.     if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  168.     {
  169.        perror("Socket");
  170.        return -1;
  171.     }

  172.     struct ifreq ifr;
  173.     strcpy(ifr.ifr_name,interface_name);

  174.     if(ioctl(s,SIOCGIFNETMASK,&ifr) < 0)
  175.     {
  176.        perror("ioctl");
  177.        return -1;
  178.     }

  179.     struct sockaddr_in * ptr;
  180.     ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_netmask;
  181.    
  182.     printf("        Netmask:%s\n",inet_ntoa(ptr->sin_addr));
  183.   
  184.     return 0;
  185. }


  186. int get_broadcast(char * interface_name)
  187. {
  188.     int s;

  189.     if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  190.     {
  191.        perror("Socket");
  192.        return -1;
  193.     }

  194.     struct ifreq ifr;
  195.     strcpy(ifr.ifr_name,interface_name);

  196.     if(ioctl(s,SIOCGIFBRDADDR,&ifr) < 0)
  197.     {
  198.        perror("ioctl");
  199.        return -1;
  200.     }

  201.     struct sockaddr_in * ptr;
  202.     ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_broadaddr;

  203.     printf("        Broadcast:%s\n",inet_ntoa(ptr->sin_addr));

  204.     return 0;

  205. }

  206. int get_interface_info(char * interface_name)
  207. {
  208.     get_ipaddr(interface_name);
  209.     get_mac(interface_name);
  210.     get_netmask(interface_name);
  211.     get_broadcast(interface_name);

  212.     return 0;
  213. }


  214. int set_interface(char * interface_name)
  215. {
  216.     char ip[18];
  217.     char mac_addr[20];
  218.     char netmask[18];
  219.     char broadcast[18];

  220.     printf("Change ");
  221.     get_ipaddr(interface_name);
  222.     printf("To:  ");
  223.     fgets(ip,17,stdin);
  224.     if(strcmp(ip,"\n") == 0)
  225.        goto set_mac;
  226.     set_ipaddr(interface_name,ip);

  227. set_mac:
  228.     printf("Change ");
  229.     get_mac(interface_name);
  230.     printf("To:  ");
  231.     fgets(mac_addr,19,stdin);
  232.     if(strcmp(mac_addr,"\n") == 0)
  233.         goto set_netmask;
  234.     set_mac(interface_name,mac_addr);

  235. set_netmask:
  236.     printf("Change ");
  237.     get_netmask(interface_name);
  238.     printf("To:  ");
  239.     fgets(netmask,17,stdin);
  240.     if(strcmp(netmask,"\n") == 0)
  241.         goto set_broadcast;
  242.     set_netmask(interface_name,netmask);

  243. set_broadcast:
  244.     printf("Change ");
  245.     get_broadcast(interface_name);
  246.     printf("To:  ");
  247.     fgets(broadcast,17,stdin);
  248.     if(strcmp(broadcast,"\n") == 0)
  249.         return 0;
  250.     set_broadcast(interface_name,broadcast);

  251.     return 0;
  252. }


  253. int interface_up(char * interface_name)
  254. {
  255.     int s;

  256.     if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  257.     {
  258.         perror("Socket");
  259.         return -1;
  260.     }

  261.     struct ifreq ifr;
  262.     strcpy(ifr.ifr_name,interface_name);

  263.     short flag;
  264.     flag = IFF_UP;
  265.     if(ioctl(s,SIOCGIFFLAGS,&ifr) < 0)
  266.     {
  267.         perror("ioctl");
  268.         return -1;
  269.     }

  270.     ifr.ifr_ifru.ifru_flags |= flag;

  271.     if(ioctl(s,SIOCSIFFLAGS,&ifr) < 0)
  272.     {
  273.         perror("ioctl");
  274.         return -1;
  275.     }

  276.     return 0;

  277. }


  278. int interface_down(char * interface_name)
  279. {
  280.     if(strcmp(interface_name,"lo") == 0)
  281.     {
  282.         printf("You can't pull down interface lo\n");
  283.         return 0;
  284.     }

  285.     int s;

  286.     if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  287.     {
  288.         perror("Socket");
  289.         return -1;
  290.     }

  291.     struct ifreq ifr;
  292.     strcpy(ifr.ifr_name,interface_name);
  293.    
  294.     short flag;
  295.     flag = ~IFF_UP;
  296.     if(ioctl(s,SIOCGIFFLAGS,&ifr) < 0)
  297.     {
  298.         perror("ioctl");
  299.         return -1;
  300.     }

  301.     ifr.ifr_ifru.ifru_flags &= flag;

  302.     if(ioctl(s,SIOCSIFFLAGS,&ifr) < 0)
  303.     {
  304.         perror("ioctl");
  305.         return -1;
  306.     }

  307.     return 0;
  308. }

  309. int set_ipaddr(char * interface_name,char * ip)
  310. {
  311.      int s;
  312.      
  313.      if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  314.     {
  315.         perror("Socket");
  316.         return -1;
  317.     }

  318.     struct ifreq ifr;
  319.     strcpy(ifr.ifr_name,interface_name);

  320.     struct sockaddr_in addr;
  321.     bzero(&addr,sizeof(struct sockaddr_in));
  322.     addr.sin_family = PF_INET;
  323.     inet_aton(ip,&addr.sin_addr);

  324.     memcpy(&ifr.ifr_ifru.ifru_addr,&addr,sizeof(struct sockaddr_in));

  325.     if(ioctl(s,SIOCSIFADDR,&ifr) < 0)
  326.     {
  327.         perror("ioctl");
  328.         return -1;
  329.     }

  330.     return 0;
  331. }

  332. int set_mac(char * interface_name,char * mac_addr)
  333. {
  334.    int s;
  335.    if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  336.    {
  337.       perror("Socket");
  338.       return -1;
  339.    }
  340.    
  341.    struct ifreq ifr;
  342.    strcpy(ifr.ifr_name,interface_name);

  343.    if(ioctl(s,SIOCGIFHWADDR,&ifr) < 0)
  344.    {
  345.       perror("ioctl");
  346.       return -1;
  347.    }

  348.    sa_family_t get_family;
  349.    get_family = ifr.ifr_ifru.ifru_hwaddr.sa_family;
  350.    
  351.    interface_down(interface_name);

  352.    bzero(&ifr,sizeof(struct ifreq));
  353.    strcpy(ifr.ifr_name,interface_name);
  354.    ifr.ifr_ifru.ifru_hwaddr.sa_family = get_family;

  355.    short tmp;
  356.    int i,j;
  357.    j = 0;
  358.    for(i = 0;i < 17; i += 3)
  359.    {
  360.       if(mac_addr[i] < 58 && mac_addr[i] > 47)
  361.          tmp = mac_addr[i]-48;
  362.       if(mac_addr[i] < 71 && mac_addr[i] > 64)
  363.          tmp = mac_addr[i]-55;
  364.       if(mac_addr[i] < 103 && mac_addr[i] > 96)
  365.          tmp = mac_addr[i]-87;
  366.       tmp = tmp << 4;
  367.       if(mac_addr[i+1] < 58 && mac_addr[i+1] > 47)
  368.          tmp |= (mac_addr[i+1]-48);
  369.       if(mac_addr[i+1] < 71 && mac_addr[i+1] > 64)
  370.          tmp |= (mac_addr[i+1]-55);
  371.       if(mac_addr[i+1] < 103 && mac_addr[i+1] > 96)
  372.          tmp |= (mac_addr[i+1]-87);
  373.       memcpy(&ifr.ifr_ifru.ifru_hwaddr.sa_data[j++],&tmp,1);
  374.    }

  375.    if(ioctl(s,SIOCSIFHWADDR,&ifr) < 0)
  376.    {
  377.        perror("ioctl");
  378.        return -1;
  379.    }

  380.    interface_up(interface_name);

  381.    return 0;
  382. }

  383. int set_netmask(char * interface_name,char * netmask)
  384. {
  385.      int s;

  386.      if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  387.     {
  388.         perror("Socket");
  389.         return -1;
  390.     }

  391.     struct ifreq ifr;
  392.     strcpy(ifr.ifr_name,interface_name);

  393.     struct sockaddr_in netmask_addr;
  394.     bzero(&netmask_addr,sizeof(struct sockaddr_in));
  395.     netmask_addr.sin_family = PF_INET;
  396.     inet_aton(netmask,&netmask_addr.sin_addr);

  397.     memcpy(&ifr.ifr_ifru.ifru_netmask,&netmask_addr,sizeof(struct sockaddr_in));

  398.     if(ioctl(s,SIOCSIFNETMASK,&ifr) < 0)
  399.     {
  400.         perror("ioctl");
  401.         return -1;
  402.     }

  403.     return 0;

  404. }


  405. int set_broadcast(char * interface_name,char * broadcast)
  406. {
  407.     int s;

  408.      if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
  409.     {
  410.         perror("Socket");
  411.         return -1;
  412.     }

  413.     struct ifreq ifr;
  414.     strcpy(ifr.ifr_name,interface_name);

  415.     struct sockaddr_in broadcast_addr;
  416.     bzero(&broadcast_addr,sizeof(struct sockaddr_in));
  417.     broadcast_addr.sin_family = PF_INET;
  418.     inet_aton(broadcast,&broadcast_addr.sin_addr);

  419.     memcpy(&ifr.ifr_ifru.ifru_broadaddr,&broadcast_addr,sizeof(struct sockaddr_in));

  420.     if(ioctl(s,SIOCSIFBRDADDR,&ifr) < 0)
  421.     {
  422.         perror("ioctl");
  423.         return -1;
  424.     }

  425.     return 0;
  426. }


  427. int usage(void)
  428. {
  429.    printf("Usage: myifconfig [all]|[interface [set|up|down]]\n");
  430.    return 0;
  431. }
复制代码
发表于 2006-4-24 18:00:53 | 显示全部楼层
呵呵,强.学习之
回复 支持 反对

使用道具 举报

发表于 2006-4-26 02:33:58 | 显示全部楼层
开源精神。
//praise
回复 支持 反对

使用道具 举报

发表于 2006-4-26 13:47:37 | 显示全部楼层
挺好, 有不少值得作为备案的东东.

不过楼主在每一项测试中都重新建立 socket, 是否有点多余呢? 而且是否应该考虑将它们用完后关闭呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-26 17:54:13 | 显示全部楼层
Post by DoDo
挺好, 有不少值得作为备案的东东.

不过楼主在每一项测试中都重新建立 socket, 是否有点多余呢? 而且是否应该考虑将它们用完后关闭呢?

这一点我也考虑到了,本打算在程序初始化的时候创建一个Socket然后在整个程序中都使用这一个Socket就可以了,但是这样每个函数就不可以单独拿出来用了。我这样写其他人都可以直接将某个函数copy出来就可以使用,而且由于基本上是一个与用户交互的程序,所以在每个函数中都创建Socket对性能来说是感觉不出来的。还有就是程序运行完了就退出,所以不关闭那些socket也不是什么问题,只是习惯不太好^_^
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表