Лучшее место для этого - извлечь требуемый код из исходного кода 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
позже).