UNIX: разработка сетевых приложений, стр. 335
4 open_pcap(void) 5 { 6 uint32_t localnet, netmask; 7 char cmd[MAXLINE], errbuf[PCAP_ERRBUF_SIZE], strl[INET_ADDRSTRLEN], 8 str2[INET_ADDRSTRLEN]; 9 struct bpf_program fcode;10 if (device == NULL) {11 if ((device = pcap_lookupdev(errbuf)) == NULL)12 err_quit("pcap_lookup: %s", errbuf);13 }14 printf("device = %s\n", device);15 /* жестко задано; promisc=0, to_ms=500 */16 if ((pd = pcap_open_live(device, snaplen, 0, 500, errbuf)) == NULL)17 err_quit("pcap_open_live: %s", errbuf);18 if (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0)19 err_quit("pcap_lookupnet %s", errbuf);20 if (verbose)21 printf("localnet = %s, netmask = %s\n",22 Inet_ntop(AF_INET, &localnet, str1, sizeof(str1)),23 Inet_ntop(AF_INET, &netmask. str2, sizeof(str2)));24 snprintf(cmd, sizeof(cmd), CMD,25 Sock_ntop_host(dest, destlen),26 ntohs(sock_get_port(dest, destlen)));27 if (verbose)28 printf("cmd = %s\n", cmd);29 if (pcap_compile(pd, &fcode, cmd, 0, netmask) < 0)30 err_quit("pcap_compile: %s", pcap_geterr(pd));31 if (pcap_setfilter(pd, &fcode) < 0)32 err_quit("pcap_setfilter: %s", pcap_geterr(pd));33 if ((datalink = pcap_datalink(pd)) < 0)34 err_quit("pcap_datalink: %s", pcap_geterr(pd));35 if (verbose)36 printf("datalink = %d\n", datalink);37 }Выбор устройства для захвата пакетов
10-14-ipcap_lookupdevSIOCGIFCONFioctlpcappcap_lookupdevОткрываем устройство
15-17pcap_open_liveliveshaplenЕсли установлен флаг смешанного режима, интерфейс переходит в этот режим, в результате чего он принимает все пакеты, проходящие по кабелю. Это обычное состояние программы
tcpdumpЧетвертый аргумент — время ожидания при считывании. Вместо того чтобы возвращать пакет процессу каждый раз, когда приходит очередной пакет (что может быть весьма неэффективно, так как в этом случае потребуется выполнять множество операций копирования отдельных пакетов из ядра в процесс), это делается, когда считывающий буфер устройства оказывается заполненным либо когда истекает время ожидания. Если время ожидания при считывании равно нулю, то каждый пакет будет переправляться процессу, как только будет получен.
Получение сетевого адреса и маски подсети
18-23pcap_lookupnetpcap_compileКомпиляция фильтра пакетов
24-30pcap_compilecmdfcodeЗагрузка программы фильтрации
31-32pcap_setfilterОпределение типа канального уровня
33-36pcap_datalinkПосле вызова функции
open_pcaptest_udp