1

我正在寻找如何以编程方式(在 C/C++/等中)获取此类信息:

# netstat -g
Link-layer Multicast Group Memberships
Group                   Link-layer Address  Netif
1:80:c2:0:0:3           <none>              en0
33:33:ff:c7:9c:2f       <none>              en1
1:0:5e:0:0:fb           <none>              en1
33:33:0:0:0:fb          <none>              en1
1:0:5e:0:0:1            <none>              en1

... 等等 ...

在 Linux 上,我可以从 /proc 文件系统中获取它,但是大量搜索却没有提供有关 OSX 的任何信息。我怀疑这可能是 sysctl() 的事情,但我没有发现关于使用哪个 sysctl() 请求。

4

1 回答 1

2

我相信经过大量搜索后我找到了答案。我终于找到了达尔文的 netstat 的来源,它引导我使用了这个函数。类型:

man getifmaddrs

好像就是那个 看起来它也是其他 BSD 的版本。

这是一些示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if_dl.h>
#include <ifaddrs.h>

int main(int argc,char **argv)
{
  struct ifmaddrs *ifmap = (struct ifmaddrs *)0;
  struct ifmaddrs *p;
  char name[32];
  unsigned char mac[6];

  if (!getifmaddrs(&ifmap)) {
    p = ifmap;
    while (p) {
      if (p->ifma_addr->sa_family == AF_LINK) {
        struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name;
        struct sockaddr_dl *la = (struct sockaddr_dl *)p->ifma_addr;
        if (la->sdl_alen == 6) {
          memcpy(name,in->sdl_data,in->sdl_nlen);
          name[in->sdl_nlen] = 0;
          memcpy(mac,la->sdl_data + la->sdl_nlen,6);
          printf("%s %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",name,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
        }
      }
      p = p->ifma_next;
    }
    freeifmaddrs(ifmap);
  }
}
于 2013-06-22T23:07:55.170 回答