【问题标题】:pcap_loop with filter does not capture any packet带过滤器的 pcap_loop 不捕获任何数据包
【发布时间】:2013-06-02 01:27:34
【问题描述】:

我遇到了 pcap 过滤器的问题。以下是部分代码:

#include <pcap.h>
#include <stdio.h>

void pcap_fatal(const char *failed_in, const char *errbuf) {
printf("Fatal error in %s: %s\n", failed_in, errbuf);
exit(1);
}

int main() {
struct pcap_pkthdr header;
const u_char *packet;
char errbuf[PCAP_ERRBUF_SIZE];
char *device;
pcap_t *pcap_handle;
int i;
struct  bpf_program filter;
char filter_str[1000];
pcap_dumper_t *pd;

device = pcap_lookupdev(errbuf);
if(device == NULL)
    pcap_fatal("pcap_lookupdev", errbuf);

printf("Sniffing on device %s\n", device);

pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);
if(pcap_handle == NULL)
    pcap_fatal("pcap_open_live", errbuf);

// Set the packet filter
sprintf(filter_str, "port 80");
if(pcap_compile(pcap_handle, &filter, filter_str, 0, 0) == -1)
    fatal("create filter");
if(pcap_setfilter(pcap_handle, &filter) == -1)
    fatal("install filter");

for(i=0; i<3; i++) {
    packet = pcap_next(pcap_handle, &header);
    printf("Got a %d bytes packet\n", header.len);
    dump(packet, header.len);
}

pd = pcap_dump_open(pd, "-");

pcap_loop(pcap_handle, -1, &pcap_dump, (char *)pd);

pcap_close(pcap_handle);

}

pcap_next()很好的抓包,dump()函数用来转储包中的数据。但是pcap_loop 没有捕获任何数据包,并且在for 循环中捕获数据包之后,它就卡住了。

我正在运行在 virtualbox 中的 ubuntu 上编程,网络适配器设置为“bridge”,这可能是问题吗?或者只是代码有问题。

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: c pcap libpcap


    【解决方案1】:

    这可能是你的问题:

    pd = pcap_dump_open(pd, "-");
    

    pcap_dump_open() 的签名是:

    pcap_dumper_t *pcap_dump_open(pcap_t *p, const char *fname);
    

    您可能是想传入pcap_handle

    pd = pcap_dump_open(pcap_handle, "-");
    

    【讨论】:

    • 啊,这是一个令人尴尬的错误。感谢您的帮助
    • 请务必注意编译器警告。编译器应该已经通知你这个特定的错误。
    • 感谢您的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多