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