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_lookupdev15-17pcap_open_liveliveshaplenЕсли установлен флаг смешанного режима, интерфейс переходит в этот режим, в результате чего он принимает все пакеты, проходящие по кабелю. Это обычное состояние программы
tcpdumpЧетвертый аргумент — время ожидания при считывании. Вместо того чтобы возвращать пакет процессу каждый раз, когда приходит очередной пакет (что может быть весьма неэффективно, так как в этом случае потребуется выполнять множество операций копирования отдельных пакетов из ядра в процесс), это делается, когда считывающий буфер устройства оказывается заполненным либо когда истекает время ожидания. Если время ожидания при считывании равно нулю, то каждый пакет будет переправляться процессу, как только будет получен.
18-23pcap_lookupnetpcap_compile24-30pcap_compilecmdfcode31-32pcap_setfilter33-36pcap_datalinkПосле вызова функции
open_pcaptest_udp