使用libpcap嗅探数据包后,我想在我的网络中存储一个IP地址列表(连接),并为每个连接存储我想要存储其TCP状态转换的内容。
是否可以使用链表?如果是这样,怎么样?
答案 0 :(得分:0)
是的,这是可能的
libpcap是一个开源C库,可以以混杂模式访问您的NIC以捕获软件包
知道?知道,我只记得这些:
- you can developed
- use tcpdump and write a condition to capture and export to a file
- use wireshark and write a condition to capture and export to a file
答案 1 :(得分:0)
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的调用分开,因为它似乎使用静态缓冲区。因此,如果计划在cmd或文件中显示输出,则应使用两个printf调用。这就是为什么它们在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连接等.RFC详细描述了如何处理它们。
最后,如果您不希望实现TCP协议,可以使用模拟Linux 2.0.x的IP堆栈的Libnids库,提供IP碎片整理和TCP流组装。