linux下获取设置网卡信息ifconf,ifreq

前言
    一个嵌入式设备,远端访问的时候基本上不可以直接访问到其下的系统,更多的是功能相关的app。
网络通信非常普及,基本上绝大部分的设备都支持网络相关操作,那么此时对该设备中的相关网络参数的获取和设置就显得有必要。

一,重要结构体

点击(此处)折叠或打开

  1. //ifconf通常是用来保存所有接口信息的
  2. //if.h
  3. struct ifconf
  4. {
  5.     int ifc_len; /* size of buffer */
  6.     union
  7.     {
  8.         char *ifcu_buf; /* input from user->kernel*/
  9.         struct ifreq *ifcu_req; /* return from kernel->user*/
  10.     } ifc_ifcu;
  11. };
  12. #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
  13. #define ifc_req ifc_ifcu.ifcu_req /* array of structures */

点击(此处)折叠或打开 (

  1. //ifreq用来保存某个接口的信息
  2. struct ifreq        
  3. {
  4. #define IFHWADDRLEN 6
  5.  union
  6.  {
  7.   char ifrn_name[IFNAMSIZ];
  8.  } ifr_ifrn;
  9.  
  10.  union {
  11.   struct sockaddr ifru_addr;
  12.   struct sockaddr ifru_dstaddr;
  13.   struct sockaddr ifru_broadaddr;
  14.   struct sockaddr ifru_netmask;
  15.   struct sockaddr ifru_hwaddr;
  16.   short ifru_flags;
  17.   int ifru_ivalue;
  18.   int ifru_mtu;
  19.   struct ifmap ifru_map;
  20.   char ifru_slave[IFNAMSIZ];
  21.   char ifru_newname[IFNAMSIZ];
  22.   void __user * ifru_data;
  23.   struct if_settings ifru_settings;
  24.  } ifr_ifru;
  25. };
  26. #define ifr_name ifr_ifrn.ifrn_name
  27. #define ifr_hwaddr ifr_ifru.ifru_hwaddr
  28. #define ifr_addr ifr_ifru.ifru_addr
  29. #define ifr_dstaddr ifr_ifru.ifru_dstaddr
  30. #define ifr_broadaddr ifr_ifru.ifru_broadaddr
  31. #define ifr_netmask ifr_ifru.ifru_netmask
  32. #define ifr_flags ifr_ifru.ifru_flags
  33. #define ifr_metric ifr_ifru.ifru_ivalue
  34. #define ifr_mtu ifr_ifru.ifru_mtu
  35. #define ifr_map ifr_ifru.ifru_map
  36. #define ifr_slave ifr_ifru.ifru_slave
  37. #define ifr_data ifr_ifru.ifru_data
  38. #define ifr_ifindex ifr_ifru.ifru_ivalue
  39. #define ifr_bandwidth ifr_ifru.ifru_ivalue
  40. #define ifr_qlen ifr_ifru.ifru_ivalue
  41. #define ifr_newname ifr_ifru.ifru_newname
  42. #define ifr_settings ifr_ifru.ifru_settings

基本介绍: 
ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了一个接口的名 字和具体内容——(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。ifreq包含在ifconf结构中。而 ifconf结构通常是用来保存所有接口的信息的。
 
举例说明:
在Linux系统中,ifconfig命令是通过ioctl接口与内核通信,例如,当系统管理员输入如下命令来改变接口eth0的MTU大小:
    ifconfig eth0 mtu 1250
ifconfig命令首先打开一个socket,然后通过系统管理员输入的参数初始化一个数据结构,并通过ioctl调用将数据传送到内核。SIOCSIFMTU是命令标识符。
    struct ifreq data;
    fd = socket(PF_INET, SOCK_DGRAM, 0);
    < ... initialize "data" ...>
    err = ioctl(fd, SIOCSIFMTU, &data);


参考文献
1,http://blog.sina.com.cn/s/blog_62ec2916010196c3.html
2,http://blog.csdn.net/kulung/article/details/6442597

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。