设为首页 加入收藏

TOP

获取网络接口信息――ioctl()函数与结构体struct ifreq、 struct ifconf(二)
2015-07-20 17:40:07 来源: 作者: 【 】 浏览:6
Tags:获取 网络 接口 信息 ioctl 函数 结构 struct ifreq ifconf
fer address */ #define ifc_req ifc_ifcu.ifcu_req /* array of structures */

该结构体可以用来获取所哟网络接口的名字和信息(不是全部信息,是ip地址) (图片来自:http://tech.sunplusedu.com/space/post-4064. aspx) \
\

Example:

#include 
   
      
#include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                typedef uint32_t uint32; #define MAX_IF 10 int main() { struct ifreq ifVec[MAX_IF];//用来保存所有接口 int sock = -1; if ( (sock = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 ) fprintf(stderr, "Error:%d, cannot open RAM;\n"); // get if vector struct ifconf ioIfConf; ioIfConf.ifc_buf = (void *)ifVec; ioIfConf.ifc_len = sizeof(ifVec); printf("Len:%d\n", ioIfConf.ifc_len); if (ioctl(sock, SIOCGIFCONF, &ioIfConf) < 0 )//获取所有网络接口信息 fprintf(stderr, "Error:%d ioctl IFCONF\n"); printf("Len:%d\n", ioIfConf.ifc_len);// 和前面到len对比,发现ioctl修改里len到大小 //循环打印每个网络接口到信息 { struct ifreq *ifPt; struct ifreq *ifEndPt; ifPt = ifVec; ifEndPt = (void *)((char *)ifVec + ioIfConf.ifc_len); for (ifPt = ifVec; ifPt < ifEndPt; ifPt++) { struct ifreq ifReq; if ( ifPt->ifr_addr.sa_family != AF_INET ) { continue; } // Temp keepers of interface params... uint32 u32_addr, u32_mask; /* 打印ip地址 */ char ipDotBuf[16], subnetDotBuf[16], maskDotBuf[16]; // 保存点分十进制到ip地址 u32_addr = ((struct sockaddr_in *)&ifPt->ifr_addr)->sin_addr.s_addr; inet_ntop(AF_INET, &u32_addr, ipDotBuf, (socklen_t )sizeof(ipDotBuf)); printf("IP Address: %s\n", ipDotBuf); /* 打印地址掩码 */ bzero(&ifReq,sizeof(struct ifreq)); memcpy(ifReq.ifr_name, ifPt->ifr_name, sizeof(ifReq.ifr_name)); if (ioctl(sock, SIOCGIFNETMASK, &ifReq ) < 0){ fprintf(stderr, "Error: %d, cannot get mask\n", errno); } else{ u32_mask = ((struct sockaddr_in *)&ifReq.ifr_addr)->sin_addr.s_addr; inet_ntop(AF_INET, &u32_mask, maskDotBuf, (socklen_t )sizeof(maskDotBuf)); printf("Mask: %s\n", maskDotBuf); } /* 打印MTU */ bzero(&ifReq,sizeof(struct ifreq)); memcpy(ifReq.ifr_name, ifPt->ifr_name, sizeof(ifReq.ifr_name)); if (ioctl(sock, SIOCGIFMTU, &ifReq ) < 0){ fprintf(stderr, "Error: %d, cannot get MTU\n", errno); } else{ printf("SIOCGIFMTU:%d\n", ifReq.ifr_mtu); } /* 其他信息的打印方式与掩码和MTU相同 */ } } }
              
             
            
           
          
         
        
       
      
     
    
   



运行结果:
windeal@ubuntu:~/Windeal/apue$ ./exe 
Len:320
Len:64
IP Address: 127.0.0.1
Mask: 255.0.0.0
SIOCGIFMTU:16436
IP Address: 172.17.92.198
Mask: 255.255.254.0
SIOCGIFMTU:1500
windeal@ubuntu:~/Windeal/apue$ 



















首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 5014 Number Sequence (贪心.. 下一篇enumerateObjectsUsingBlock 、fo..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)