一个相同的程序可以在Opensuse 12.1 (x64)上成功运行,但不能在Fedora16 (x64)上运行,它显示"Err can 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;}
发布于 2012-04-19 04:17:16
如果pcap_compile()失败,您应该执行以下操作
printf("Err calling pcap_compile: %s\n", pcap_geterr(descr));看看它报告了什么问题。这可能会帮助我们确定Fedora上出了什么问题;如果不知道故障是什么,就很难确定如何修复它-过滤器应该在任何支持IP的链路层类型上工作,而pcap_lookupdev()应该总是返回这样的设备。
但是,如果您正在打开一个没有分配IPv4地址的设备,那么pcap_lookupnet()可能会失败。如果失败,您可能只需要将0作为netp和maskp传递-您可以在调用pcap_lookupnet()之前将它们初始化为0。然而,这应该不会有什么不同-网络和掩码不应该是像dst port 1521这样的过滤器所必需的。
(顺便说一句,-1不是pcap_open_live()的有效超时参数-我会使用1000 -但在Linux上可能没问题;如果无效,打开将失败,但打开不会失败,因为它在pcap_compile()中报告了一个错误。)
https://stackoverflow.com/questions/10040883
复制相似问题