Networking libpcap读取数据包大小

Networking libpcap读取数据包大小,networking,wireshark,pcap,tcpdump,Networking,Wireshark,Pcap,Tcpdump,我开始编写一个应用程序,它将从现有的.pcap文件中读取RTP/H.264视频数据包,我需要读取数据包的大小。 我尝试使用数据包->len或标头->len,但它从来没有为数据包显示正确的字节数(我使用wireshark验证数据包大小-在长度列下)。怎么做? 这是我代码的一部分: while (packet = pcap_next(handle,&header)) { u_char *pkt_ptr = (u_char *)packet; struct ip *ip_hdr =

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

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”

您应该使用
header.len

unsigned int packet_length = header.len;

您应该使用
header.len

unsigned int packet_length = header.len;
不要那样做;您正在丢弃
常量
,实际上不应该修改
pcap\u next()
的返回值所指向的内容

只有当
pcap\u datalink(handle)
返回
DLT\u RAW
时,才会指向IP头结构,这在大多数设备上可能不会执行

例如,如果
pcap_数据链路(句柄)
返回
DLT_EN10MB
packet
将指向一个以太网报头(这个
10MB
是历史性的-它用于所有以太网速度,而不是Xerox公司历史悠久的3MB实验以太网,它具有不同的报头类型)

请参阅,以获取可能的
DLT\uu
类型的列表

那也不行。数据包的
struct pcap\u pkthdr
位于
标题中

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

(请记住,如果在
pcap\u open\u live()
调用中指定了短于最大数据包大小的“快照长度”,或者在
pcap\u set\u snaplen()调用中指定了
pcap\u create()
pcap\u activate()之间的
调用,
header.caplen
可以小于
header.len
,并且实际上只有
header.caplen
字节的数据包数据可用。)

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

不要那样做;您正在丢弃
常量
,实际上不应该修改
pcap\u next()
的返回值所指向的内容

只有当
pcap\u datalink(handle)
返回
DLT\u RAW
时,才会指向IP头结构,这在大多数设备上可能不会执行

例如,如果
pcap_数据链路(句柄)
返回
DLT_EN10MB
packet
将指向一个以太网报头(这个
10MB
是历史性的-它用于所有以太网速度,而不是Xerox公司历史悠久的3MB实验以太网,它具有不同的报头类型)

请参阅,以获取可能的
DLT\uu
类型的列表

那也不行。数据包的
struct pcap\u pkthdr
位于
标题中

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

(请记住,如果在
pcap\u open\u live()
调用中指定了短于最大数据包大小的“快照长度”,或者在
pcap\u set\u snaplen()调用中指定了
pcap\u create()
pcap\u activate()之间的
调用,
header.caplen
可以小于
header.len
,并且实际上只有
header.caplen
字节的数据包数据可用。)

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

  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);