libpcap/default_interface.c
如果不知道要選擇哪個Interface抓取封包,可以取得預設的Interface,但是每個系統預設的Interface都有點不同,在Mac Retina之前en0
是接線的Ethernet,en1
是Wi-Fi,Retina後的en0
則是Wi-Fi,Linux預設就是eth0
,Windows就不一定了。
Source Code
//
// default_interface.c
// 功能:列出預設interface和網段及遮罩。
// Created by 聲華 陳 on 2015/12/28.
//
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#include <arpa/inet.h>
int main(int argc, const char * argv[]) {
char errbuf[PCAP_ERRBUF_SIZE];
char *device = NULL;
bpf_u_int32 netp, maskp;
char ntop_buf[256];
//get default interface name
device = pcap_lookupdev(errbuf);
if(!device) {
fprintf(stderr, "pcap_lookupdev: %s", errbuf);
exit(1);
}//end if
printf("Default: %s\n", device);
//get interface network and netmask
if(-1 == pcap_lookupnet(device, &netp, &maskp, errbuf)) {
fprintf(stderr, "pcap_lookupnet: %s\n", errbuf);
exit(1);
}//end if
//network
inet_ntop(AF_INET, &netp, ntop_buf, sizeof(ntop_buf));
printf("Network: %s\n", ntop_buf);
//netmask
inet_ntop(AF_INET, &maskp, ntop_buf, sizeof(ntop_buf));
printf("Netmask: %s\n", ntop_buf);
return 0;
}
結果
libpcap % ./default_interface
Default: en0
Network: 172.16.64.0
Netmask: 255.255.192.0
程式會列出預設的Interface。
分析
//get default interface name
device = pcap_lookupdev(errbuf);
if(!device) {
fprintf(stderr, "pcap_lookupdev: %s", errbuf);
exit(1);
}//end if
利用pcap_lookupdev()
取得預設的Interface。
//get interface network and netmask
if(-1 == pcap_lookupnet(device, &netp, &maskp, errbuf)) {
fprintf(stderr, "pcap_lookupnet: %s\n", errbuf);
exit(1);
}//end if
接著使用pcap_lookupnet()
網段資訊,其中bpf_u_int32
只是一個unsigned的32位元int,第一個參數表示要取得哪個Interface的訊息,網段會儲存在netp
,遮罩會儲存在maskp
。
//network
inet_ntop(AF_INET, &netp, ntop_buf, sizeof(ntop_buf));
printf("Network: %s\n", ntop_buf);
//netmask
inet_ntop(AF_INET, &maskp, ntop_buf, sizeof(ntop_buf));
printf("Netmask: %s\n", ntop_buf);
利用inet_ntop()
將取得的netp
及maskp
轉成字串並列印出來。
結語
如果不確定該選擇哪個Interface時,可以使用該程式抓預設的Interface。另外在之後設定過濾器時會需要pcap_lookupnet()
函數。