我们有时候会有获取网口的IP和MAC地址的需求。可以通过ioctl来获取。

#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
void main(void)
{
  struct ifreq ifr;
  struct ifconf ifc;
  char buff[1024];
  int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  ifc.ifc_len = sizeof(buff);
  ifc.ifc_buf = buff;
  ioctl(fd, SIOCGIFCONF, &ifc);//获取所有的网口信息
  struct ifreq *it = ifc.ifc_req;
  const struct ifreq* const end = it + ifc.ifc_len/sizeof(struct ifreq);
  for (; it != end; it++)//遍历网口
  {
    strncpy(ifr.ifr_name, it->ifr_name, strlen(it->ifr_name) + 1);//网口名称,如“eth0”“ra0”
    printf("ifr_name :%s\n", ifr.ifr_name);
    if (ioctl(fd, SIOCGIFFLAGS, &ifr) == 0)
    {
      if (!(ifr.ifr_flags & IFF_LOOPBACK))//忽略lo
      {
        if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0)//获取MAC
        {
          unsigned char mac[6];
          memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
          printf("mac: %02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3], mac[4], mac[5]);
        }
        if (ioctl(fd, SIOCGIFADDR, &ifr) == 0)//获取IP
        {
          struct sockaddr_in sin;
          memcpy(&sin, &ifr.ifr_addr, sizeof(struct sockaddr_in));
          printf("ip: %s\n", inet_ntoa(sin.sin_addr));
        }
      }
    }
  }
}

运行结果如下:

最新文章

  1. IL指令详细表
  2. java进程CPU飙高
  3. Jquery 生成时钟
  4. Android开发之获取相册照片和获取拍照照片
  5. lucene.net 使用过程中的 几个注意事项(含termquery 和QueryParser 的区别)
  6. UVa 514 (stack的使用) Rails
  7. RFID Reader 线路图收集
  8. Visual Studio C++ Command Line
  9. W3C盒子与IE盒子模型
  10. ceph主要数据结构解析2-Rados.h文件
  11. 修改apk显示或隐藏桌面图标
  12. 高速掌握sinox2014激动人心的ZFS和RAID技术
  13. 解决TXT乱码问题
  14. 创建Sdcard
  15. 记录一次EF优化
  16. thinkphp无法加载控制器:Admin
  17. tex 字体斜体设置
  18. centos7安装nginx1.10.1
  19. C语言+嵌入式SQL+DB2开发经验总结
  20. C# 之 反射性能优化1

热门文章

  1. open行情
  2. scala学习笔记(8): 列表的map,flatMap,zip和reduce
  3. Android fragment源码全解析
  4. Java文件下载的几种方式
  5. js四舍五入
  6. linux umask使用详解
  7. CH340在STM32实现一键下载电路
  8. C++ 中类的构造函数理解(二)
  9. win8 VS控件信息
  10. BITED数学建模七日谈之三:怎样进行论文阅读