1

これまでのところ、これが私のコードです。


#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int & argc, char* argv[]){


    char *net; /* dot notation of the network address */
    char *mask;/* dot notation of the network mask    */
    int ret;   /* return code */
    char errbuf[PCAP_ERRBUF_SIZE];
    bpf_u_int32 netp; /* ip          */
    bpf_u_int32 maskp;/* subnet mask */
    struct in_addr addr;

    char *dev; /* name of the device to use */

    printf("Asking pcap to find a valid device for use to sniff on.\n");
    dev = pcap_lookupdev(errbuf);
    if(dev == NULL) {
        printf("pcap_lookupdev ERROR:  %s\n",errbuf);
        exit(1);
    }

    printf("Printing out device name.\n");
    printf("DEV: %s\n",dev);

    printf("Asking pcap for the network address and mask of the device.\n");
    ret = pcap_lookupnet(dev,&netp,&maskp,errbuf);
    if(ret == -1) {
        printf("Unable to retrieve the network address and mask of the device.  Error Description:  %s\n",errbuf);
        exit(1);
    }

    printf("Get the network address in a human readable form,\n");
    addr.s_addr = netp;
    net = inet_ntoa(addr);
    if(net == NULL) {
        printf("Unable to retrieve network address in human readable form.\n");
        perror("inet_ntoa");
        exit(1);
    }

    printf("NET: %s\n",net);

    /* do the same as above for the device's mask */
    addr.s_addr = maskp;
    mask = inet_ntoa(addr);

    if(mask == NULL) {
        printf("Unable to retrieve device mask in human readable form.  ");
        perror("inet_ntoa");
        exit(1);
    }

    printf("MASK: %s\n",mask);
    return 0;
}

/*
Output:

Asking pcap to find a valid device for use to sniff on.
Printing out device name.
DEV: eth0
Asking pcap for the network address and mask of the device.
Unable to retrieve the network address and mask of the device.  Error Description:  eth0: no IPv4 address assigned

*/

これが私の質問です: pcap_lookupdev にワイヤレス デバイス (つまり wlan0) を検索させるにはどうすればよいですか?

4

2 に答える 2

2

pcap_findalldevsドキュメントは、 pcap_lookupdev()が適切なネットワークデバイスを見つけられない理由を示唆しています。

pcap_findalldevs()を呼び出すプロセスがpcap_open_live()で開くことができないネットワークデバイスが存在する可能性があることに注意してください。たとえば、そのプロセスには、キャプチャのためにデバイスを開くための十分な権限がない場合があります。その場合、それらのデバイスはリストに表示されません

利用可能なネットワークデバイスのいずれかでトラフィックをキャプチャするために必要な権限がない可能性があります。マシンの管理者権限があると仮定して、 sudoを使用してプログラムを実行してみてください。

追加情報については、libpcap関数のroot権限の要件を参照してください。

于 2011-08-10T19:40:17.303 に答える
0

pcap_lookupdev()1 つのデバイスを検索します。それはあなたが望むデバイスではないかもしれません。有線と無線の両方のインターフェイス デバイスがある場合は、有線デバイスが見つかる可能性があります。これは、無線デバイスを調べていないからではなく、たまたま最初に見つかったデバイスだったからです。

ワイヤレス デバイスだけを見るように指示する方法はありません。

libpcap が処理できるすべてのデバイスのリストを取得するには、 を使用しますpcap_findalldevs()

于 2012-10-19T20:44:58.160 に答える