linux - 在弄清楚如何使用 ioctl/SIOCGIFADDR/SIOCGIFCONF 在 Mac OS X 上获取以太网接口(interface)信息时遇到问题?

标签 linux macos ethernet ioctl

您是否在弄清楚如何使用 ioctl/SIOCGIFADDR/SIOCGIFCONF 在 Mac OS X 上获取界面信息时遇到问题?

今天,我很难让在 Linux 上运行良好的代码在 Mac OS X 上运行。

最佳答案

复制粘贴到 main.cgcc main.c && ./a.out 应该可以工作(列出所有网络接口(interface)、它们的 ipv4/6 地址、网络掩码和 MAC 地址(如果关联):

Mac OSXiOS iPad/iPhone 上运行良好:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <ifaddrs.h>
#include <errno.h>

int main() {
  struct ifaddrs *if_addrs = NULL;
  struct ifaddrs *if_addr = NULL;
  void *tmp = NULL;
  char buf[INET6_ADDRSTRLEN];
  if (0 == getifaddrs(&if_addrs)) {    
    for (if_addr = if_addrs; if_addr != NULL; if_addr = if_addr->ifa_next) {

      printf("name : %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,
                         tmp,
                         buf,
                         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 - 在弄清楚如何使用 ioctl/SIOCGIFADDR/SIOCGIFCONF 在 Mac OS X 上获取以太网接口(interface)信息时遇到问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3964494/

相关文章:

java - Linux 和 Windows java 编译器生成相同还是不同的类文件?

linux - 比较两个文件并将不匹配的数字写入新文件

xcode - 在 Xamarin.Mac/XCode-Storyboard 中制作按钮时遇到问题

java - 相当于 Oracle 中的 IBM JVerb for Java 中的 RDMA

android - 对 H264 NAL 流进行 fragment 整理(最初是 1722 avb 数据包)

linux - 以太网校验和是否通过 AF_PACKET 公开?

linux - php脚本不是从命令行执行的

linux - 用于分析目的的编译选项

r - 通过 Homebrew 软件安装特定版本的 R

linux - 如何将 FFProbe 编译为独立应用程序? (苹果机/Linux/赢)