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