我开始编写一个应用程序,它将从现有的.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'不是结构或联合
答案 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);
而且,根据我之前的评论,这可能也行不通。