libpcap读取数据包大小

时间:2013-06-18 02:37:17

标签: networking wireshark pcap tcpdump

我开始编写一个应用程序,它将从现有的.pcap文件读取RTP / H.264视频数据包,我需要读取数据包大小。 我尝试使用 packet-> len或header-> len ,但它从不显示数据包的正确字节数(我使用 wireshark 来验证数据包size - 在“长度”列下。怎么做? 这是我的代码的一部分:

while (packet = pcap_next(handle,&header)) {

  u_char *pkt_ptr = (u_char *)packet;
  struct ip *ip_hdr = (struct ip *)pkt_ptr; //point to an IP header structure 
  struct pcap_pkthdr  *pkt_hdr =(struct pcap_pkthdr *)packet;

  unsigned int packet_length = pkt_hdr->len;
  unsigned int ip_length = ntohs(ip_hdr->ip_len);
  printf("Packet # %i IP Header length: %d bytes, Packet length: %d bytes\n",pkt_counter,ip_length,packet_length);


Packet # 0 IP Header length: 180 bytes, Packet length: 104857664 bytes
Packet # 1 IP Header length: 52 bytes, Packet length: 104857600 bytes
Packet # 2 IP Header length: 100 bytes, Packet length: 104857600 bytes
Packet # 3 IP Header length: 100 bytes, Packet length: 104857664 bytes
Packet # 4 IP Header length: 52 bytes, Packet length: 104857600 bytes
Packet # 5 IP Header length: 100 bytes, Packet length: 104857600 bytes

我尝试的另一个选择是使用: pkt_ptr->我明白了:

read_pcapfile.c:67:43:错误:请求成员'len'不是结构或联合

2 个答案:

答案 0 :(得分:2)

您应该使用header.len

unsigned int packet_length = header.len;

答案 1 :(得分:1)

while (packet = pcap_next(handle,&header)) {

  u_char *pkt_ptr = (u_char *)packet;

不要那样做;你丢弃const,你真的应该 NOT 修改pcap_next()的返回值指向的内容。

  struct ip *ip_hdr = (struct ip *)pkt_ptr; //point to an IP header structure

如果pcap_datalink(handle)返回DLT_RAW,它将指向IP头结构 ONLY ,它可能会 NOT 在大多数设备上执行。< / p>

例如,如果pcap_datalink(handle)返回DLT_EN10MB,则packet将指向以太网标头(10MB是历史记录 - 它已被使用除了Xerox上具有不同标头类型的古老历史3MB实验性以太网之外的所有以太网速度。

请参阅the list of link-layer header type values以获取可能DLT_类型的列表。

  struct pcap_pkthdr  *pkt_hdr =(struct pcap_pkthdr *)packet;

这也行不通。数据包的struct pcap_pkthdr位于header

  unsigned int packet_length = pkt_hdr->len;

根据我之前的评论,这是行不通的。请改用header.len

(请注意,如果在pcap_open_live()来电中指定了短于最大数据包大小的“快照长度”,或在pcap_set_snaplen()之间的pcap_create()来电中指定了“快照长度”和pcap_activate()次呼叫,header.caplen可能小于header.len,并且只有header.caplen个字节的分组数据实际可用。)

  unsigned int ip_length = ntohs(ip_hdr->ip_len);

而且,根据我之前的评论,这可能也行不通。