2011-10-20 64 views
0

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

回答

1

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

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; 
}