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()將取得的netpmaskp轉成字串並列印出來。

結語

如果不確定該選擇哪個Interface時,可以使用該程式抓預設的Interface。另外在之後設定過濾器時會需要pcap_lookupnet()函數。

results matching ""

    No results matching ""