<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    兩個結構體ifconf和ifreq

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    用ioctl獲得本地ip地址時要用到兩個結構體ifconf和ifreq,它們對于大多數人
    來說都是比較陌生的,這里給大家一種比較簡單的理解方法,當然只一種幫助
    理解的方法,在描述中可能會有一些地方與真實定義有所出入,僅供參考.

    首先先認識一下ifconf和ifreq:

    //ifconf通常是用來保存所有接口信息的
    //if.h
    struct ifconf 
    {
        int    ifc_len;            /* size of buffer    */
        union 
        {
            char *ifcu_buf;                        /* input from user->kernel*/
            struct ifreq *ifcu_req;        /* return from kernel->user*/
        } ifc_ifcu;
    };
    #define    ifc_buf    ifc_ifcu.ifcu_buf        /* buffer address    */
    #define    ifc_req    ifc_ifcu.ifcu_req        /* array of structures    */
     
    //ifreq用來保存某個接口的信息
    //if.h
    struct ifreq {
        char ifr_name[IFNAMSIZ];
        union {
            struct sockaddr ifru_addr;
            struct sockaddr ifru_dstaddr;
            struct sockaddr ifru_broadaddr;
            short ifru_flags;
            int ifru_metric;
            caddr_t ifru_data;
        } ifr_ifru;
    };
    #define ifr_addr ifr_ifru.ifru_addr
    #define ifr_dstaddr ifr_ifru.ifru_dstaddr
    #define ifr_broadaddr ifr_ifru.ifru_broadaddr

     

    上邊這兩個結構看起來比較復雜,我們現在把它們簡單化一些:
    比如說現在我們向實現獲得本地IP的功能。

    我們的做法是:
    1. 先通過ioctl獲得本地所有接口的信息,并保存在ifconf中
    2. 再從ifconf中取出每一個ifreq中表示ip地址的信息

    具體使用時我們可以認為ifconf就有兩個成員:
    ifc_len 和 ifc_buf,如圖一所示:   

    RFID設備管理軟件 

     

     

    ifc_len:表示用來存放所有接口信息的緩沖區長度
    ifc_buf:表示存放接口信息的緩沖區

    所以我們需要在程序開始時對ifconf的ifc_led和ifc_buf進行初始化
    接下來使用ioctl獲取所有接口信息,完成后ifc_len內存放實際獲得的借口信息總長度
    并且信息被存放在ifc_buf中。

    接下來我們只需要從一個一個的接口信息獲取ip地址信息即可。

    下面有一個簡單的參考:

     

     

     

    #include 
    #include 
    #include 
    #include 
    #include in.h>
    #include <string.h>
    #include if.h>
    #include 
     
    int main()
    {
        int i=0;
        int sockfd;
      struct ifconf ifconf;
      unsigned char buf[512];
      struct ifreq *ifreq;
      
      //初始化ifconf
      ifconf.ifc_len = 512;
      ifconf.ifc_buf = buf;
      
        if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)
        {
            perror("socket");
            exit(1);
        }  
      ioctl(sockfd, SIOCGIFCONF, &ifconf);    //獲取所有接口信息
      
      //接下來一個一個的獲取IP地址
      ifreq = (struct ifreq*)buf;  
      for(i=(ifconf.ifc_len/sizeof(struct ifreq)); i>0; i--)
      {
    //      if(ifreq->ifr_flags == AF_INET){            //for ipv4
              printf("name = [%s]\n", ifreq->ifr_name);
          printf("local addr = [%s]\n", 
                          inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
          ifreq++;
    //  }
      }
        return 0;
    }

     

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全