最好的方法是从 tcpdump 源代码中提取所需的代码,就我而言,这基本上是 libpcap 的操作指南和网络介绍合二为一。
无论如何,您需要的是从pcap_open_live
. 您还需要创建另一个线程或进程,因为pcap_open_live
它会在当前线程工作时阻塞。
现在,数据包处理函数如下所示:
void packethandler( u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* packet )
{
// ... allocs etc
// these instructions convert the "packet" string
// to a struct and determine it's type, a setting in
// the ethernet header.
eptr = (struct ether_header *) packet;
ether_type = ntohs(eptr->ether_type);
// ...
// these two functions extract the mac addresses
// into appropriately alloc'd strings.
// ether_ntoa converts the binary representation
// of the mac address into a string
snprintf(ethernet_shost, 20, "%s", ether_ntoa((struct ether_addr *)eptr->ether_shost));
snprintf(ethernet_dhost, 20, "%s", ether_ntoa((struct ether_addr *)eptr->ether_dhost));
// carry on...
}
这将为您提供作为字符串的 mac 地址。但是请注意,联网并不容易。你需要知道你在用二进制信息字符串做什么,转换等,你需要知道数字和选项的含义。如果 tcpdump 源看起来很复杂,那是因为网络复杂。此外,我还没有列出实现此过程所需的标题。那里有 pcap 教程;我建议你花时间阅读它们。我只是给你一个答案不会教你网络。
而且,这个功能是不完整的。您将需要为存储阵列进行适当的分配(pcap 是您可能想要使用的 C 库,char*
而不是稍后string
再提取string
)。