2012-02-05 143 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