当前位置: 技术问答>linux和unix
有用过libpcap的大哥帮忙看一看
来源: 互联网 发布时间:2015-04-07
本文导语: 我刚开始学libpcap,有一个地方搞不明白,就是bpf_hdr结构和pcap_pkthdr结构有什么关系,我看过的介绍都说他们是加在抓来的数据包的前面,而且内容都一样,只是后者多了一个成员。哪位大哥帮我解释一下好吗? 另...
我刚开始学libpcap,有一个地方搞不明白,就是bpf_hdr结构和pcap_pkthdr结构有什么关系,我看过的介绍都说他们是加在抓来的数据包的前面,而且内容都一样,只是后者多了一个成员。哪位大哥帮我解释一下好吗?
另外我用它写了一个小程序,原意是想显示抓到包的内容,可是总是提示说第22和25行"derefenencing pointer to incomplete type",源程序在下面,请哪位大哥帮忙看一下:
#include
#include
#define SIZEOF_BPF_HDR 20
int main()
{
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *pf;
struct pcap_pkthdr h;
struct bpf_hdr *bf;
int i;
pf=pcap_open_live("eth0",68,0,1000,errbuf);
while(1)
{
pcap_next(pf,&h);
bf=(struct bpf_hdr *)pf->buffer; //第22行
for(i=0;ibh_caplen;i++)
{
printf("%.2x",*((pf->buffer+SIZEOF_BPF_HDR)+i)); //第25行
}
printf("nend of one packet!nn");
}
pcap_close(pf);
}
千万不要嫌分少,这是我所有的分数了,拜托了!!!!!
另外我用它写了一个小程序,原意是想显示抓到包的内容,可是总是提示说第22和25行"derefenencing pointer to incomplete type",源程序在下面,请哪位大哥帮忙看一下:
#include
#include
#define SIZEOF_BPF_HDR 20
int main()
{
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *pf;
struct pcap_pkthdr h;
struct bpf_hdr *bf;
int i;
pf=pcap_open_live("eth0",68,0,1000,errbuf);
while(1)
{
pcap_next(pf,&h);
bf=(struct bpf_hdr *)pf->buffer; //第22行
for(i=0;ibh_caplen;i++)
{
printf("%.2x",*((pf->buffer+SIZEOF_BPF_HDR)+i)); //第25行
}
printf("nend of one packet!nn");
}
pcap_close(pf);
}
千万不要嫌分少,这是我所有的分数了,拜托了!!!!!
|
出现这个错误的原因是编译器无法找到pcap_t的定义。pcap_t在pcap.h里定义为:
typdef struct pcap pcap_t;
但struct pcap定义在pcap-int.h里,这个头文件在make install时没有被安装,需要自己拷贝到pcap.h所在的目录下。
typdef struct pcap pcap_t;
但struct pcap定义在pcap-int.h里,这个头文件在make install时没有被安装,需要自己拷贝到pcap.h所在的目录下。
|
我也是刚开始学习pcap,我不太清楚你所说的bpf_hdr结构和pcap_pkthdr结构的区别。
我读了一下你的程序,感觉你是想,将指向pcap结构的buffer域的指针,赋给一个指向bpf_hdr结构的指针。
我把第22行改为:
bf=(struct bpf_hdr *) pf;
bf += OFFSET;
把第25行改为:
printf("%.2x",*((bf+SIZEOF_BPF_HDR)+i));
这样程序是可以编译通过,并且执行的!!!
注意,上面的OFFSET应该是pcap结构buffer域之前的所有域的总长度。这个长度不太好算,我做实验时用了一个常数值。
我以前看到有程序中写过sizeof(struct pcap_sf)这样的语句。但我在编译时,gcc报错:“sizeof applied to an incomplete type”。不过sizeof(int), sizeof(int *)这样的写法是可行的,大不了,就是一个域一个域地累加罢!!!
一已之言,不知是否正确理解了兄台的原意。我最近也在学pcap,希望与大家交流,请多指教!
我读了一下你的程序,感觉你是想,将指向pcap结构的buffer域的指针,赋给一个指向bpf_hdr结构的指针。
我把第22行改为:
bf=(struct bpf_hdr *) pf;
bf += OFFSET;
把第25行改为:
printf("%.2x",*((bf+SIZEOF_BPF_HDR)+i));
这样程序是可以编译通过,并且执行的!!!
注意,上面的OFFSET应该是pcap结构buffer域之前的所有域的总长度。这个长度不太好算,我做实验时用了一个常数值。
我以前看到有程序中写过sizeof(struct pcap_sf)这样的语句。但我在编译时,gcc报错:“sizeof applied to an incomplete type”。不过sizeof(int), sizeof(int *)这样的写法是可行的,大不了,就是一个域一个域地累加罢!!!
一已之言,不知是否正确理解了兄台的原意。我最近也在学pcap,希望与大家交流,请多指教!