как тайм-аут периодически в функции приема пакетов libpcap - PullRequest
2 голосов
/ 25 июля 2011

Я нашел этот пост в stackoverflow.com прослушивание с использованием Pcap с таймаутом

Я сталкиваюсь с аналогичной (но другой) проблемой: каков метод GENERIC (независимый от платформы), чтобы периодически превышать время ожидания при получении захваченных пакетов с использованием функций приема пакетов libpcap? На самом деле, мне интересно, можно ли периодически тайм-аут из pcap_dispatch (pcap_t ...) / pcap_next_ex (pcap_t ...)? Если это возможно, я могу использовать их так же, как и классическую функцию выбора (... тайм-аут) (http://linux.die.net/man/2/select).

Кроме того, на официальной веб-странице (http://www.tcpdump.org/pcap3_man.html) я обнаружил, что оригинальный механизм тайм-аута считается ошибочным и зависит от платформы (это плохо, поскольку моя программа может работать на разных компьютерах Linux и Unix):
«... to_ms определяет время ожидания чтения в миллисекундах. Время ожидания чтения используется для того, чтобы чтение не обязательно возвращалось сразу при просмотре пакета, но ожидание некоторого количества времени для поступления большего количества пакетов и считывание нескольких пакетов из ядра ОС за одну операцию.Не все платформы поддерживают тайм-аут чтения, на платформах, которые этого не делают, тайм-аут чтения игнорируется ... ...
ПРИМЕЧАНИЕ: при чтении захвата в реальном времени pcap_dispatch () не обязательно вернется, когда время чтения истекло; на некоторых платформах тайм-аут чтения не поддерживается, а на других платформах таймер не запускается, пока не поступит хотя бы один пакет. Это означает, что время ожидания чтения НЕ должно использоваться, например, в интерактивном приложении, чтобы позволить циклу захвата пакета периодически «опрашивать» пользовательский ввод, поскольку нет гарантии, что pcap_dispatch () вернется после истечения времени ожидания. . ... "

Поэтому, я думаю, мне нужно реализовать сам механизм GENERIC (независимый от платформы), как показано ниже?

  1. создать структуру pcap_t с помощью pcap_open_live ().
  2. установить его в неблокирующем режиме с помощью pcap_setnonblock (pcap_t ...).
  3. опросить этот неблокирующий pcap_t с зарегистрированным таймером ОС, например:

зарегистрировать ОС timer_x и сбросить timer_x;

while (1) {

if (время таймера истекло) {делать то, что нужно делать периодически; сброс таймера_x;}

опросить pcap_t, вызвав pcap_dispatch (pcap_t ...) / pcap_next_ex (pcap_t ...) для получения некоторых пакетов;
сделать что-нибудь с этими пакетами;

} // конец while (1)

С уважением,
DC

1 Ответ

1 голос
/ 27 июля 2011

Вы можете получить дескриптор с помощью pcap_fileno () и выбрать его (). Здесь образец здесь в OfferReceiver :: Listen ().

...