如何从C中的pcap获取网络层和传输层协议?

时间:2011-10-20 22:56:02

标签: c pcap libpcap

我正在进行一项任务,让我使用libpcap库从C中的pcap文件解析信息。我已经成功地弄清楚如何获取数据,例如source / dest ip地址,tcp / udp端口和source / dest以太网地址。列表中的下一步是从网络和传输层协议中获取统计信息以及每个协议有多少数据包。我担心我似乎无法弄清楚如何获得这个,并希望有人可能指出我正确的方向。由于其他信息是从/usr/include/netinet.h等地的各种数据结构中收集而来的,因此这也应该在某处,但是,我又有点迷失了。

2 个答案:

答案 0 :(得分:2)

好像你已经有了答案...... IP是一个网络层协议,所以如果你能找到IP地址,你可以统计IP数据包。类似地,TCP和UDP是传输层协议。如果您可以在数据包中找到TCP / UDP端口,那么您已经知道有多少数据包在使用哪种协议。

答案 1 :(得分:0)

在你的回调函数中

/* define/compute ip header offset */
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
size_ip = IP_HL(ip)*4;
if (size_ip < 20) {
  printf("   * Invalid IP header length: %u bytes\n", size_ip);
  return;
}

switch(ip->ip_p) {
 case IPPROTO_TCP:
 /* define/compute tcp header offset */
  tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
  size_tcp = TH_OFF(tcp)*4;
  if (size_tcp < 20) {printf("   * Invalid TCP header length: %u bytes\n", size_tcp);   return; }
  bytes_tcp+=ntohs(ip->ip_len);
  packets_tcp++;
  break;
}
 case IPPROTO_UDP:
  bytes_udp+=ntohs(ip->ip_len);
  packets_udp++;
 break;
}