Один вариант (я говорю вариант) состоит в том, чтобы использовать pcap_next с использованием libpcap и разбирать его на части, чтобы увидеть, является ли это пакет udp. Вы можете сделать это с:
/* jump pass the ethernet header */
ipdata = (struct ip*)(packet + sizeof(struct ether_header));
length -= sizeof(struct ether_header);
(Заимствовано из tcpdump)
и затем протестируйте структуру ip, чтобы увидеть, является ли это пакет udp, выполнив:
if ( ipdata->ip_p == IPPROTO_UDP )
И если это не удается, продолжайте цикл (вызывая pcap_next), пока не получите свой пакет udp. Конечно, извлекать дейтаграмму udp сложнее, но она довольно хорошо позволяет вам проникнуть внутрь пакета. Обратитесь к источнику tcpdump, чтобы узнать, как извлекать информацию и что выходит.