0

相同的程序可以在 Opensuse 12.1 (x64) 上成功运行 虽然在 Fedora 16 上的 Fedora 16 (x64) 上无法运行,但它显示“Err calling pcap_compile” 我不知道这些操作系统之间有什么区别,我想他们完全一样,但我确保 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()。但是,这不应该有所作为 - 过滤器不需要网络和掩码,例如dst port 1521.

(顺便说一句,-1这不是一个有效的超时参数pcap_open_live()- 我会使用 1000 代替 - 但这在 Linux 上可能没问题;如果它无效,打开会失败,但打开不会对你失败,因为它正在报告中的错误pcap_compile()。)

于 2012-04-18T20:17:15.613 回答