【发布时间】:2012-02-05 10:15:40
【问题描述】:
我正在尝试以编程方式在 FreeBSD 中查找网络接口信息。在 linux 中,接口列在 /etc/network/interfaces 文件中。
FreeBSD 中有这样的文件吗?如何提取这些信息?
【问题讨论】:
标签: c networking interface freebsd
我正在尝试以编程方式在 FreeBSD 中查找网络接口信息。在 linux 中,接口列在 /etc/network/interfaces 文件中。
FreeBSD 中有这样的文件吗?如何提取这些信息?
【问题讨论】:
标签: c networking interface freebsd
你总是可以使用getifaddrs(3) 这是一个例子:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
int main(void) {
struct ifaddrs *ifap,*ifa;
getifaddrs(&ifap);
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
printf("%s\n",ifa->ifa_name);
}
freeifaddrs(ifap);
}
编辑:在 linux 上,如果你需要获取接口的链路层地址,你需要查找 AF_PACKET sa_family,它位于 netpacket/packet.h 在 linux 上,*bsd 它被称为 AF_LINK,它在 net/if_dl.h 中
#ifdef AF_LINK
# include <net/if_dl.h>
#endif
#ifdef AF_PACKET
# include <netpacket/packet.h>
#endif
#ifdef AF_LINK
#define SDL ((struct sockaddr_dl *)ifa->ifa_addr)
if (SDL->sdl_family == AF_LINK) {
bcopy(SDL->sdl_data + SDL->sdl_nlen,....,SDL->sdl_alen
}
#undef SDL
#endif
#ifdef AF_PACKET
if (ifa->ifa_addr->sa_family == AF_PACKET) {
struct sockaddr_ll *sl =
(struct sockaddr_ll*) ifa->ifa_addr;
bcopy(sl->sll_addr,....,sl->sll_halen
}
#endif
【讨论】: