利用 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.

Last updated