蘋果小豬研究室
Ask or search…
K

利用 libpcap 取得所有的網路裝置名稱

利用 libpcap 的 function 來尋找目前 Linux 系統上所有的網路卡裝置名稱, 1. 需要安裝 libpcap 才能使用 libpcap,下面是編譯的方法:
# gcc search_dev.c -o search_dev -lpcap
執行結果:
# ./search_dev eth0 any lo
/* libpcap */
/* Author: Aaron Liao */
#include<stdio.h>
#include<pcap.h>
int main(void)
{
pcap_if_t *dev, *ptr;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_findalldevs(&dev, errbuf);
for(ptr=dev; ptr != NULL; ptr = ptr->next){
printf("%s\n", ptr->name);
}
pcap_freealldevs(dev);
return 0;
}
其 實用 libpcap 有一些特別的好處,就是寫出來的程式可以在 libpcap 有支援的平台上直接使用 [1],例如可以在 linux 跟 freebsd 上通用,因為若是在 Linux 寫 link layer socket,是使用 PF_PACKET, 例如: 新寫法:
socket(PF_PACKET, SOCK_RAW, ... );
舊寫法:
socket(AF_INET, SOCK_PACKET, ... );
例如要接收所有 datalink layer frames 可以這麼寫:
socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL));
若是只接收 IPv4 frames,
socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)); socket(AF_INET, SOCK_RAW, htons(ETH_P_IP));
而在 bsd 上面則是使用 bsd packet filter (BPF) 而使用 libpcap 寫程式,好處就是只要使用 libpcap 提供的 function, 而不需要在意各系統平台的 socket 呼叫方法。 [1] Richard Steven, UNIX Network Programming, Volume 2, Second Edition: Interprocess Communications, Prentice Hall, 1999, ISBN 0-13-081081-9.