0

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

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”不是结构或联合

4

2 回答 2

2

你应该使用header.len.

unsigned int packet_length = header.len;
于 2013-07-01T11:13:39.117 回答
2
while (packet = pcap_next(handle,&header)) {

  u_char *pkt_ptr = (u_char *)packet;

不要那样做;你扔掉了const,你真的pcap_next()应该修改指向的返回值。

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

pcap_datalink(handle)返回时才会指向 IP 标头结构,这在大多数设备上DLT_RAW可能不会这样做。

例如,如果return ,pcap_datalink(handle)将指向以太网标头(这是历史的 - 它用于所有以太网速度,除了 Xerox 的古老历史 3MB 实验以太网,它具有不同的标头类型)。DLT_EN10MBpacket10MB

有关可能类型的列表,请参阅链路层标头类型值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.caplenheader.lenheader.caplen

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

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

于 2013-07-01T17:03:34.200 回答