snifex.c - хорошее начало (http://www.tcpdump.org/pcap.html)
В функции обратного вызова:
got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);
указатель * ip указывает на начало заголовка ip.
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
Там вы можете найти информацию об IP-адресе. Обратите внимание, что вы должны разделить вызовы inet_ntoa, так как кажется, что они используют статический буфер. Поэтому вы должны использовать два вызова printf, если вы планируете показывать вывод в cmdили файл. Вот почему они находятся в отдельных строках в snifex.c:
printf(" From: %s\n", inet_ntoa(ip->ip_src));
printf(" To: %s\n", inet_ntoa(ip->ip_dst));
Для получения информации о TCP вы можете использовать указатель tcp
tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
Использовать флаги TCP tcp-> th_flags для определения состояния соединения, например, tcp->th_flags==TH_SYN
После того, как вы знаете флаги, вы должны проверить диаграмму состояний RFC793 TCP / IP, чтобы определить состояние протокола TCP.
С точки зрения реализаций, вы могли бы использовать хеш-массив для каждого 4-го кортежа (srcIP, dstIP, srcPort, dstPort), чтобы иметь O (1) (лучший случай). Обратите внимание, что может бытьслучаи, когда вы видите средний поток или полуоткрытый TCP cсоединения и т. д. RFC подробно описывает, как с ними обращаться.
Наконец, если вы не хотите реализовывать протокол TCP, вы можете использовать библиотеку Libnids , которая эмулирует стек IP Linux2.0.x, предлагает дефрагментацию IP и сборку потока TCP.