linux – 在使用ioctl / SIOCGIFADDR / SIOCGIFCONF找出如何在Mac OS X上获取以太网接口信息时遇到问题?

您是否在使用ioctl / SIocgIFADDR / SIocgIFCONF了解如何在Mac OS X上获取接口信息时遇到问题?

我很难在Linux上获得能够在Mac OS X上运行的代码.

最佳答案
复制粘贴到main.c和gcc main.c&& ./a.out应该工作(列出所有网络接口,它们的ipv4 / 6地址,网络掩码和MAC地址,如果相关):

适用于Mac OSX和iOS iPad / iPhone:

#include dio.h>
#include %s\n",if_addr->ifa_name);

      // Address
      if (if_addr->ifa_addr->sa_family == AF_INET) {
        tmp = &((struct sockaddr_in *)if_addr->ifa_addr)->sin_addr;
      } else {
        tmp = &((struct sockaddr_in6 *)if_addr->ifa_addr)->sin6_addr;
      }
      printf("addr : %s\n",inet_ntop(if_addr->ifa_addr->sa_family,tmp,buf,sizeof(buf)));

      // Mask
      if (if_addr->ifa_netmask != NULL) {
        if (if_addr->ifa_netmask->sa_family == AF_INET) {
          tmp = &((struct sockaddr_in *)if_addr->ifa_netmask)->sin_addr;
        } else {
          tmp = &((struct sockaddr_in6 *)if_addr->ifa_netmask)->sin6_addr;
        }
        printf("mask : %s\n",inet_ntop(if_addr->ifa_netmask->sa_family,sizeof(buf)));
      }

      // MAC address
      if (if_addr->ifa_addr != NULL && if_addr->ifa_addr->sa_family == AF_LINK) {
        struct sockaddr_dl* sdl = (struct sockaddr_dl *)if_addr->ifa_addr;
        unsigned char mac[6];
        if (6 == sdl->sdl_alen) {
          memcpy(mac,LLADDR(sdl),sdl->sdl_alen);
          printf("mac  : %02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
        }
      }

      printf("\n");
    }
    freeifaddrs(if_addrs);
    if_addrs = NULL;
  } else {
    printf("getifaddrs() Failed with errno =  %i %s\n",errno,strerror(errno));
    return -1;
  }
}

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...