Как я могу получить протоколы сетевого уровня и транспортного уровня от pcap в C? - PullRequest
0 голосов
/ 21 октября 2011

Я работаю над заданием, которое позволяет мне анализировать информацию из файла pcap в C с использованием библиотеки libpcap. Я имел успех в выяснении, как получить данные, такие как IP-адреса источника / Dest, порты TCP / UDP и Ethernet-адреса источника / Dest. Следующим в списке является получение статистики по протоколам сетевого и транспортного уровня и количества пакетов на протокол. Боюсь, я не могу понять, как получить доступ к этому, и я надеюсь, что кто-то может указать мне в правильном направлении. Поскольку другая информация была получена из различных структур данных из таких мест, как /usr/include/netinet.h, это тоже должно быть где-то там, но, опять же, я немного растерялся.

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Похоже, у вас уже есть ответы ... IP - это протокол сетевого уровня, поэтому, если вы можете найти IP-адрес, вы можете считать IP-пакеты.Точно так же TCP и UDP являются протоколами транспортного уровня.Если вы можете найти порты TCP / UDP в пакетах, то вы уже знаете, сколько пакетов использует какие протоколы.

0 голосов
/ 24 февраля 2012

В вашей функции обратного вызова

/* 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;
}
...