struct ifconf和struct ifreq,获取网线插入状态

这两天看用C获取当前网口的插入网线状态的程序,遇见了这两个不熟悉的结构体,看了头文件中的说明和详细。

struct ifreq

这个结构定义在include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的

 

[cpp]  view plain copy
 
  1. /* Interface request structure used for socket ioctl's.  All interface 
  2.    ioctl's must have parameter definitions which begin with ifr_name. 
  3.    The remainder may be interface specific.  */  
  4.   
  5. struct ifreq  
  6.   {  
  7. # define IFHWADDRLEN    6  
  8. # define IFNAMSIZ   IF_NAMESIZE  
  9.     union  
  10.       {     
  11.     char ifrn_name[IFNAMSIZ];   /* Interface name, e.g. "en0".  */  
  12.       } ifr_ifrn;  
  13.   
  14.     union  
  15.       {     
  16.     struct sockaddr ifru_addr;  
  17.     struct sockaddr ifru_dstaddr;  
  18.     struct sockaddr ifru_broadaddr;  
  19.     struct sockaddr ifru_netmask;  
  20.     struct sockaddr ifru_hwaddr;  
  21.     short int ifru_flags;  
  22.     int ifru_ivalue;  
  23.     int ifru_mtu;  
  24.     struct ifmap ifru_map;  
  25.     char ifru_slave[IFNAMSIZ];  /* Just fits the size */  
  26.     char ifru_newname[IFNAMSIZ];  
  27.     __caddr_t ifru_data;  
  28.       } ifr_ifru;  
  29.   };    
  30. # define ifr_name   ifr_ifrn.ifrn_name  /* interface name   */  
  31. # define ifr_hwaddr ifr_ifru.ifru_hwaddr    /* MAC address      */  
  32. # define ifr_addr   ifr_ifru.ifru_addr  /* address      */  
  33. # define ifr_dstaddr    ifr_ifru.ifru_dstaddr   /* other end of p-p lnk */  
  34. # define ifr_broadaddr  ifr_ifru.ifru_broadaddr /* broadcast address    */  
  35. # define ifr_netmask    ifr_ifru.ifru_netmask   /* interface net mask   */  
  36. # define ifr_flags  ifr_ifru.ifru_flags /* flags        */  
  37. # define ifr_metric ifr_ifru.ifru_ivalue    /* metric       */  
  38. # define ifr_mtu    ifr_ifru.ifru_mtu   /* mtu          */  
  39. # define ifr_map    ifr_ifru.ifru_map   /* device map       */  
  40. # define ifr_slave  ifr_ifru.ifru_slave /* slave device     */  
  41. # define ifr_data   ifr_ifru.ifru_data  /* for use by interface */  
  42. # define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index      */  
  43. # define ifr_bandwidth  ifr_ifru.ifru_ivalue    /* link bandwidth   */  
  44. # define ifr_qlen   ifr_ifru.ifru_ivalue    /* queue length     */  
  45. # define ifr_newname    ifr_ifru.ifru_newname   /* New name     */  
  46. # define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)  
  47. # define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)  
  48. # define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)  

 

 

struct  ifconf

通常是用来保存所有接口信息的

 

[cpp]  view plain copy
 
  1. /* Structure used in SIOCGIFCONF request.  Used to retrieve interface 
  2.    configuration for machine (useful for programs which must know all 
  3.    networks accessible).  */  
  4.   
  5. struct ifconf  
  6.   {  
  7.     int ifc_len;            /* Size of buffer.  */  
  8.     union  
  9.       {  
  10.     __caddr_t ifcu_buf;  
  11.     struct ifreq *ifcu_req;  
  12.       } ifc_ifcu;  
  13.   };  
  14. # define ifc_buf    ifc_ifcu.ifcu_buf   /* Buffer address.  */  
  15. # define ifc_req    ifc_ifcu.ifcu_req   /* Array of structures.  */  
  16. # define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0) /* not right */  

 

 

应用

想要获取当前网口网线插入状态,需要用到ifreq结构体,获取网卡的信息,然后socket结合网卡驱动的ioctl,就可以得到与网线插入状态相关的数据。
另外推荐一个百度文库的文章,包含代码

http://wenku.baidu.com/view/59f4508d680203d8ce2f2412.html

你可能感兴趣的:(struct ifconf和struct ifreq,获取网线插入状态)