抓封包的時候必須指定device,如果不確定要選擇哪個device,libpcap提供了可以傳回預設的device。
宣告變數吧。
char errbuf[PCAP_ERRBUF_SIZE]; char *device = NULL;
變數device是等等傳回結果要用的。
直接用函數
pcap_lookupdev()
取得預設的device。//get default interface name device = pcap_lookupdev(errbuf); if(!device) { fprintf(stderr, "pcap_lookupdev(): %s\n", errbuf); exit(1); }//end if printf("Default: %s\n", device);
函數
pcap_lookupdev()
原型:char *pcap_lookupdev(char *errbuf);
- 返回值:成功傳回預設device,失敗傳回NULL,錯誤訊息在errbuf。
- 參數:errbuf錯誤訊息。
- 功能:取得預設的device。
既然都取得了預設device,那麼順便取得一些其他資訊;函數
pcap_lookupnet()
能夠取得某device的network和netmask資訊。bpf_u_int32 net, mask; //get network and netmask if(-1 == pcap_lookupnet(device, &net, &mask, errbuf)) { fprintf(stderr, "pcap_lookupnet(): %s\n", errbuf); exit(1); }//end if
函數
pcap_lookupnet()
原型:int pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf);
- 返回值:成功傳回0,失敗傳回-1,錯誤訊息在errbuf。
- 參數:device要查詢的介面名稱。netp網段地址指標。maskp遮罩地址指標。errbuf錯誤訊息。
- 功能:取得device的網段及遮罩。
取得的地址當然會是網路地址格式,所以使用函數
inet_ntop()
來轉成字串。char ntop_buf[256]; //network inet_ntop(AF_INET, &net, ntop_buf, sizeof(ntop_buf)); printf("Network: %s\n", ntop_buf); //netmask inet_ntop(AF_INET, &mask, ntop_buf, sizeof(ntop_buf)); printf("Netmask: %s\n", ntop_buf);
編譯方式跟上一篇一樣用
gcc
libpcap % gcc -I/usr/local/opt/libpcap/include -Wall -std=gnu99 -L/usr/local/opt/libpcap/lib -lpcap default-device.c -o default-device
執行結果(Mac OS X):
libpcap % ./default-device Default: en0 Network: 192.168.0.0 Netmask: 255.255.255.0
執行結果(CentOS):
[root@tutu libpcap]# ./default-device Default: eth0 Network: 192.168.0.0 Netmask: 255.255.255.0
Source code on Github
沒有留言:
張貼留言