首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式获取OSX上网络设备的组播组成员身份

以编程方式获取OSX上网络设备的组播组成员身份
EN

Stack Overflow用户
提问于 2013-06-23 01:06:35
回答 1查看 513关注 0票数 1

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

代码语言:javascript
复制
# 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()请求的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-23 07:07:55

我相信我已经找到了答案,经过大量的搜索。我终于找到了Darwin的netstat的源代码,它把我带到了这个函数。类型:

代码语言:javascript
复制
man getifmaddrs

看起来就是它了。它看起来也是用于其他BSD的。

下面是一些示例代码:

代码语言:javascript
复制
#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);
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17253230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档