0

同じプログラムを Opensuse 12.1 (x64) で正常に実行できます Fedora 16 上の Fedora 16 (x64) では実行できませんが、「Err calling pcap_compile」と表示されました これらの OS の違いはわかりません。まったく同じですが、Opensuse 12.1 がパケットを正常にフィルタリングおよびキャプチャできることを確認します。

int init_capture() {
int i;
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
const u_char *packet;
struct pcap_pkthdr hdr; /* pcap.h */
struct ether_header *eptr; /* net/ethernet.h */
struct bpf_program fp;
char portfilter[20]= "dst port 1521";
bpf_u_int32 maskp;
bpf_u_int32 netp;
/* grab a device to peak into... */
dev = pcap_lookupdev(errbuf);
if (dev == NULL) {
    printf("%s\n", errbuf);
    exit(1);
}
pcap_lookupnet(dev,&netp,&maskp,errbuf);
/* open device for reading */
descr = pcap_open_live(dev, BUFSIZ, 0, -1, errbuf);
if (descr == NULL) {
    printf("pcap_open_live(): %s\n", errbuf);
    exit(1);
}
if (pcap_compile(descr,&fp,portfilter,0,netp) == -1)
{
    printf("Err calling pcap_compile\n");
    exit(1);
}
if (pcap_setfilter(descr,&fp) == -1)
{
    printf("Err setting filter \n");
    exit(1);
}

/* allright here we call pcap_loop(..) and pass in our callback function */
/* int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)*/
/* If you are wondering what the user argument is all about, so am I!!   */
pcap_loop(descr, -1, capture_callback, NULL);

fprintf(stdout, "\nDone processing packets... wheew!\n");
return 0;

}

4

1 に答える 1

0

pcap_compile()失敗したらやるべき

printf("Err calling pcap_compile: %s\n", pcap_geterr(descr));

報告されている問題を確認します。これは、Fedora で何が問題なのかを判断するのに役立つかもしれません。障害何であるかを知らずに、それを修正する方法を決定するのは困難です。フィルターは、IP をサポートするすべてのリンク層タイプで機能するpcap_lookupdev()必要があり、常にそのようなデバイスを返す必要があります。

ただし、pcap_lookupnet()たとえば、IPv4 アドレスが割り当てられていないデバイスを開こうとすると、失敗する可能性があります。失敗した場合は、おそらく両方として 0 を渡す必要がありnetpますmaskp。- を呼び出す前に、それらを 0 に初期化するだけですpcap_lookupnet()ただし、違いはありません。 net と mask は、 などのフィルターには必要ありませんdst port 1521

(ところで、-1有効なタイムアウト引数ではありませんpcap_open_live()-代わりに1000を使用します-しかし、Linuxでは問題ないかもしれません。有効でない場合、オープンは失敗しますが、報告されているため、オープンは失敗していませんのエラーですpcap_compile()。)

于 2012-04-18T20:17:15.613 に答える