Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以编程方式获取OSX上网络设备的多播组成员资格_C_Macos_Network Programming_Multicast_Darwin - Fatal编程技术网

C 以编程方式获取OSX上网络设备的多播组成员资格

C 以编程方式获取OSX上网络设备的多播组成员资格,c,macos,network-programming,multicast,darwin,C,Macos,Network Programming,Multicast,Darwin,我正在寻找如何通过编程(在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

我正在寻找如何通过编程(在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
#netstat-g
链路层多播组成员身份
组链路层地址Netif
1:80:c2:0:0:3 en0
33:33:ff:c7:9c:2f en1
1:0:5e:0:0:fb en1
33:33:0:0:0:fb en1
1:0:5e:0:0:1 en1
。。。等等


在Linux上,我可以从/proc文件系统获得它,但是大量的搜索并没有发现关于OSX的任何信息。我怀疑这可能是sysctl()的问题,但我没有找到有关sysctl()请求使用的任何内容。

我相信我在进行了大量搜索后找到了答案。我终于找到了达尔文的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);
  }
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
结构ifmaddrs*ifmap=(结构ifmaddrs*)0;
结构ifmaddrs*p;
字符名[32];
无符号字符mac[6];
if(!getifmaddrs(&ifmap)){
p=ifmap;
while(p){
如果(p->ifma\u addr->sa\u family==AF\u LINK){
struct sockaddr\u dl*in=(struct sockaddr\u dl*)p->ifma\u name;
结构sockaddr\u dl*la=(结构sockaddr\u dl*)p->ifma\u addr;
如果(la->sdl_alen==6){
memcpy(名称,在->sdl\U数据,在->sdl\U nlen);
名称[in->sdl\U nlen]=0;
memcpy(mac,la->sdl\u数据+la->sdl\u nlen,6);
printf(“%s%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n”,名称,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}
}
p=p->ifma\u下一步;
}
freeifmadrs(ifmap);
}
}

另外:以下是相关的达尔文资料来源: