gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:47:40 25 4
gpt4 key购买 nike

我正在寻找如何以编程方式(在 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() 请求使用的信息。

最佳答案

我相信经过大量的搜索后我已经找到了答案。我终于找到了 Darwin 的 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);
}
}

关于c - 以编程方式获取 OSX 上网络设备的多播组成员身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17253230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com