zoukankan      html  css  js  c++  java
  • c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息

    网络编程 UDP 用if_nameindex和ioctl取得主机网络信息

    getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数。

    1,if_nameindex 取得网卡名字和网卡编号

    #include <stdio.h>
    #include <net/if.h>
    
    int main(){
      struct if_nameindex *idxlist, *idx;
    
      idxlist = if_nameindex();
      if(idxlist == NULL){
        perror("if_nameindex");
        return 1;
      }
    
      for(idx = idxlist; idx->if_name != NULL && idx->if_index != 0;++idx){
        printf("%s	%d
    ", idx->if_name, idx->if_index);
      }
    
      if_freenameindex(idxlist);
    
      return 0;
    }
    

    github源代码

    2,ioctl 取得网卡的名字。

    注意点:ioctl调用了2次,第一次是为了得到ifc.ifc_len,第二次用得到了ifc.ifc_len的精确大小,来开辟内存空间。

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <net/if.h>
    #include <sys/ioctl.h>
    
    int main(){
      ifconf ifc;
      ifreq* ifr;
      int fd;
      int nifs, i;
    
      fd = socket(AF_INET, SOCK_DGRAM, 0);
    
      ifc.ifc_len = 0;
      ifc.ifc_ifcu.ifcu_buf = NULL;
    
      ioctl(fd, SIOCGIFCONF, &ifc);
      printf("%d
    ", ifc.ifc_len);
    
      if(ifc.ifc_len == 0){return 1;}
    
      ifc.ifc_ifcu.ifcu_buf = (char*)malloc(ifc.ifc_len);
      ioctl(fd, SIOCGIFCONF, &ifc);
    
      nifs = ifc.ifc_len / sizeof(ifreq);
    
      ifr = (ifreq*)ifc.ifc_ifcu.ifcu_buf;
      for(i = 0; i < nifs; ++i){
        printf("%s
    ",ifr[i].ifr_name);
      }
    
      close(fd);
    
      return 0;
    }
    
    

    github源代码

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    按格式读取csv文件内容
    C#分块拷贝大文件
    在 Active Directory 上也有 LINQ 可以用了:LINQ to Active Directory
    CSVDE
    lucene索引查看工具luke和文本提取工具Tika
    Perf工具
    RHEL7.2安装
    Hive on ES
    灰度发布
    LSM树由来、设计思想以及应用到HBase的索引
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9789111.html
Copyright © 2011-2022 走看看