2016年11月4日 星期五

libpcap - Default device(3)


抓封包的時候必須指定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

沒有留言:

張貼留言