2015-07-08 2 views
2

настоящее время я использую Libpcap для перехвата трафика в беспорядочном режимеКак сделать libpcap/pcap_loop неблокирующим?

int main() 
{ 
    // some stuff 
    printf("Opening device: %s\n", devname.c_str()); 

    handle = pcap_open_live(devname.c_str(), 65536 , 1 , 0 , errbuf); 

    if (handle == NULL) 
    { 
     fprintf(stderr, "Couldn't open device %s : %s..." , devname.c_str(), errbuf); 
     return 1; 
    } 
    printf(" Done\n"); 

    pcap_loop(handle , -1 , process_packet , NULL); 
    // here run a thread to do some stuff. however, pcap_loop is blocking 
    return 0; 
} 

Я хотел бы добавить внешнюю резьбу, чтобы сделать некоторые другие вещи. Как изменить код выше, чтобы сделать его неблокирующим?

+1

Запустить эту тему, прежде чем вызывать pcap_loop? –

+0

Я могу попробовать, но что, если я захочу сделать что-то еще после pcap_loop? – Bob

ответ

3

Когда вы используете неблокирующий режим на libpcap, вы должны использовать pcap_dispatch, но обратите внимание: pcap_dispatch может работать в блокировке или в режиме без блокировки, зависит от того, как вы устанавливаете libpcap, чтобы установить libpcap для работы в неблокирующем вы должны использовать функцию pcap_setnonblock:

int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf); 

разница между блокировкой и неблокируемым не цикл, который работает всегда, но в блокировании функции pcap_dispatch ожидает для пакета и возвращает только когда этот пакет будет получен, однако , в неблокирующем режиме функция немедленно возвращается, и обратный вызов должен обрабатывать пакет.

В режиме «без блокировки», попытка чтения из захвата дескриптора с pcap_dispatch() будет, если пакеты не являются в настоящее время доступны для чтения, возвращает 0, сразу же, а не блокирует ждет пакетов прибывать. pcap_loop() и pcap_next() не будут работать в режиме «неблокирования».

http://www.tcpdump.org/manpages/pcap_setnonblock.3pcap.html

0

pcap_loop предназначен для продолжения до тех пор, пока все входные данные не будут завершены. Если вы не хотите этого поведения, вызовите pcap_dispatch в цикле. По определению pcap_loop никогда не вернется, это означает, что он всегда ищет больше данных.

+0

спасибо. на данный момент я запускаю поток до pcap_loop. Кажется, это работает. – Bob

0

Я использую pcap_next_ex Он возвращает результат, указывающий, если пакет был прочитан. Таким образом, я управляю приобретением своей собственной нити. См. Пример here. read_timeout в pcap_open также влияет на эту функцию.

Смежные вопросы