4
我试图在FreeBSD中编程地查找网络接口信息。在linux中,接口列在/ etc/network/interfaces文件中。FreeBSD:网络接口信息
FreeBSD中有这样的文件吗?我如何提取这些信息?
我试图在FreeBSD中编程地查找网络接口信息。在linux中,接口列在/ etc/network/interfaces文件中。FreeBSD:网络接口信息
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);
}
编辑:对,如果你需要获取其在netpacket找到你需要寻找AF_PACKET上sa_family,接口的链路层地址的Linux /packet.h 在Linux,* BSD其称为AF_LINK及其在净/ 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
这是列出重复的条目,但我得到了你的观点。我会研究结构。 – hari 2012-02-06 05:52:16
@hari,是因为它有一个分配给接口的每个*地址的条目(可以是链接层,ipv4,ipv6 ..),并且你可以在linux,macosx,* bsd中使用相同的东西, - 就像AF_LINK在Linux上不存在,但它的名为AF_PACKET的链接laye - 编辑帖子以反映这 – jackdoe 2012-02-06 06:11:29
感谢您的帮助。 – hari 2012-02-06 16:17:27