2012-02-05 140 views
4

我试图在FreeBSD中编程地查找网络接口信息。在linux中,接口列在/ etc/network/interfaces文件中。FreeBSD:网络接口信息

FreeBSD中有这样的文件吗?我如何提取这些信息?

回答

9

,你可以随时使用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   
+0

这是列出重复的条目,但我得到了你的观点。我会研究结构。 – hari 2012-02-06 05:52:16

+0

@hari,是因为它有一个分配给接口的每个*地址的条目(可以是链接层,ipv4,ipv6 ..),并且你可以在linux,macosx,* bsd中使用相同的东西, - 就像AF_LINK在Linux上不存在,但它的名为AF_PACKET的链接laye - 编辑帖子以反映这 – jackdoe 2012-02-06 06:11:29

+0

感谢您的帮助。 – hari 2012-02-06 16:17:27