libpcap版本1.3.0-PRE-GIT
#include <stdio.h>#include <string.h>#include <stdlib.h>#define __USE_BSD#include <sys/types.h>#include <pcap.h>#define Debug(format, ...) fprintf(stderr, "%s:%d: "format "\n", __FILE__, __LINE__, ##__VA_ARGS__)#define assert_(expr_)do {if (!(expr_)) {Debug("在函數 `%s'中: 斷言錯誤: " #expr_, __FUNCTION__); exit (-1);} } while (0)#define pcap_assert(func_) assert_(func_!=-1)static char buf[10000];
注意這裡在include "pcap.h"之前,一定要先#define __USE_BSD 然後再include "sys/types.h",否則會出現這樣的錯誤:
/usr/local/include/pcap/pcap.h:126:2: 錯誤:未知的類型名‘u_short’/usr/local/include/pcap/pcap.h:171:2: 錯誤:未知的類型名‘u_int’/usr/local/include/pcap/pcap.h:172:2: 錯誤:未知的類型名‘u_int’/usr/local/include/pcap/pcap.h:173:2: 錯誤:未知的類型名‘u_int’/usr/local/include/pcap/pcap.h:236:30: 錯誤:未知的類型名‘u_char’/usr/local/include/pcap/pcap.h:237:9: 錯誤:未知的類型名‘u_char’/usr/local/include/pcap/pcap.h:351:30: 錯誤:未知的類型名‘pcap_handler’/usr/local/include/pcap/pcap.h:351:44: 錯誤:未知的類型名‘u_char’
原因還沒有弄清。還有另外一個宏叫做 #define __FAVOR_BSD 也許以後會用到。
前面的聲明部分都寫好以後,後面的操作其實很容易,一步就搞定了。
int main(){//find devicepcap_if_t *alldevs;pcap_assert(pcap_findalldevs(&alldevs, buf));int i=0;for (pcap_if_t *pdev = alldevs; pdev; pdev=pdev->next)Debug("#%d: %s %s", ++i, pdev->name, pdev->description? pdev->description:"");pcap_freealldevs(alldevs);return 0;}
編譯:
gcc --std=c99 -lpcap dev_test.c -o dev_test
運行結果
viktor@buxiang-OptiPlex-330:~/proj/pcap$ sudo ./dev_test dev_test.c:37: #1: peth0 dev_test.c:37: #2: eth0 dev_test.c:37: #3: usbmon1 USB bus number 1dev_test.c:37: #4: usbmon2 USB bus number 2dev_test.c:37: #5: usbmon3 USB bus number 3dev_test.c:37: #6: usbmon4 USB bus number 4dev_test.c:37: #7: usbmon5 USB bus number 5dev_test.c:37: #8: any Pseudo-device that captures on all interfacesdev_test.c:37: #9: lo