zoukankan      html  css  js  c++  java
  • struct ifconf和struct ifreq,获取网线插入状态

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

    struct ifreq

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

    [cpp] view plaincopy
     
    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 plaincopy
     
    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

  • 相关阅读:
    Python 基础 字符串拼接 + if while for循环
    JTable 的使用方法
    java与数据库连接的几个步骤
    socket通信 _ 一个简单的群聊系统
    基本的文件读写
    多线程之碰撞小球
    java类的继承
    java类和对象
    java中的关键字
    java 线程实现方式
  • 原文地址:https://www.cnblogs.com/lidabo/p/5100635.html
Copyright © 2011-2022 走看看