加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 在使用ioctl / SIOCGIFADDR / SIOCGIFCONF找出如何在Ma

发布时间:2020-12-14 01:52:03 所属栏目:Linux 来源:网络整理
导读:您是否在使用ioctl / SIOCGIFADDR / SIOCGIFCONF了解如何在Mac OS X上获取接口信息时遇到问题? 我很难在Linux上获得能够在Mac OS X上运行的代码. 解决方法 复制粘贴到main.c和gcc main.c ./a.out应该工作(列出所有网络接口,它们的ipv4 / 6地址,网络掩码和MA
您是否在使用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 <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 : %sn",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 : %sn",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 : %sn",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:%02xn",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 %sn",errno,strerror(errno));
    return -1;
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读