我在C ++中使用libpcap来读取pcap文件中的数据包,例如:
rc = pcap_next_ex((pcap_t*)handle, &header, (const unsigned char**)packet);
我想解析数据包标头(没有有效负载)。
例如,如何解析给定的数据包以提取其源和目的地IP地址?
感谢
答案 0 :(得分:5)
查看libpcap http://www.tcpdump.org/pcap.html
的代码示例在got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);
函数中,您有一个指向数据包开头的指针*packet
。要解析以太网头,您只需使用相应的指针
ethernet = (struct sniff_ethernet*)(packet);
对于IP层
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
如果要解析其他协议,只需定义自己的结构即可。如果您希望(或不希望)解析有效负载,那么您可以(或不)定义指向有效负载起点的指针。
答案 1 :(得分:2)
IP报头的数据字段以big-endian顺序打包,并且数据包有效负载在IP报头结束后立即附加。查看示例here