C - 无法设置 pcap 过滤器。功能无法正常工作

标签 c function filter network-programming pcap

当我尝试运行此函数时,它在第二个 if 语句处遇到了障碍并打印: 无法设置 pcap 过滤器:ip dest host 92.40.255.82 ��z]$(注意末尾的奇数符号)。 我怀疑错误出在 bpf_program filterprog 中,但还没有解决它。 我已经检查了相关的手册页,除非我错过了一些东西,否则我使用的功能应该没问题......所以我很困惑。它与错误消息末尾的符号有关吗? 为什么它不设置过滤器?

void capture()
{
pcap_t *pd;
bpf_u_int32 netmask;
bpf_u_int32 localnet;
char filterbuf[64];
snprintf(filterbuf, sizeof(filterbuf), "ip dest host %s", dstip); 
char *filter = filterbuf;       
char *dev = NULL;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program filterprog;
int dl = 0, dl_len = 0;

if ((pd = pcap_open_live(dev, 1514, 1, 500, errbuf)) == NULL) 
    {           
        fprintf(stderr, "cannot open device %s: %s\n", dev, errbuf);
        exit(1);
    }

pcap_lookupnet(dev, &localnet, &netmask, errbuf);
pcap_compile(pd, &filterprog, filter, 0, localnet);
if (pcap_setfilter(pd, &filterprog) == - 1)
    {
        fprintf(stderr, "cannot set pcap filter: %s %s\n", filter, errbuf);
        exit(1);
    }

pcap_freecode(&filterprog);
dl = pcap_datalink(pd);

switch(dl) {
    case 1:
        dl_len = 14;
        break;
    default:
        dl_len = 14;
        break;
}       

if (pcap_loop(pd, -1, receive, (u_char *) &dl_len) < 0) 
    {
        fprintf(stderr, "cannot get raw packet: %s\n", pcap_geterr(pd));
        exit(1);
    }
}

编辑:这些是对 dstip 的其他引用:

(在原型(prototype)中)char *dstip = 0;

(在主程序中)dstip = optarg;

最佳答案

您的过滤器错误(s/b ip dst host,而不是ip dest host),错误消息的原因如下:

errbuf - 返回错误文本,仅在 pcap_lookupnet 子例程失败时设置

成功完成后,pcap_setfilter 子例程返回 0。如果 pcap_setfilter 子例程不成功,则返回 -1。在这种情况下,pcap_geterr 子例程可用于获取错误文本,pcap_perror 子例程可用于显示文本。

关于C - 无法设置 pcap 过滤器。功能无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058305/

相关文章:

c - 何时将指针参数传递给函数

c - 我不知道如何更改字符串并在末尾添加更多字符

c - 在函数体内调用其他函数之前,函数如何以及在何处保存 'returned value of one function'?

image-processing - 推导图像卷积核的逆滤波器

MS-DOS 的 C 编译器

c - 如何使用 int ** ptr 释放二维数组分配的内存

javascript - 将传递的函数参数与默认参数合并

ios - 函数不允许我使用#named : string

javascript - 使用 JavaScript 过滤 Firebase 查询

javascript - 用于嵌套 ng-repeat 的 Angular 独特过滤器