Вы можете использовать необработанные сокеты или, например, библиотеку pcap. С помощью pcap вы устанавливаете фильтр и захватываете интересный трафик:
#include <pcap.h>
...
pcap_t* reader_handle;
char errbuf[PCAP_ERRBUF_SIZE];
if ( (reader_handle = pcap_open_live(device_string, capture_size, 0, timeout, errbuf) ) == NULL)
{
//ooops
}
struct bpf_program fp;
if (pcap_compile(reader_handle, &fp, filter_string, 1, 0) == -1)
{
//ooops, cleanup
}
if (pcap_setfilter(reader_handle, &fp) == -1)
{
//ooops, cleanup
}
pcap_freecode(&fp);
И после этого вы просто снимаете, есть несколько разных способов, например:
pcap_pkthdr* header;
u_char* pkt_data;
const int status = pcap_next_ex(reader_handle, &header, &pkt_data);
// Check the status
После окончания захвата:
pcap_close(reader_handle);
Вам нужны привилегии, чтобы играть с необработанными сокетами. Приведенный выше пример можно красиво обернуть в C ++.