C: libpcap не перехватывает пакеты wlan0

Я новичок в C и немного запутался. Я прочитал несколько тем об этой проблеме, но ни одна из них не помогла мне. Я пытаюсь перехватить пакеты wlan0 с помощью libpcap, но что-то идет не так. Функция pcap_next() возвращает null, но я не могу понять, почему. Вот мой код:

#include <pcap.h>
#include <stdio.h>
#include <string.h>

void dump(const unsigned char *data_buffer, const unsigned int length)    {
   unsigned char byte;
   unsigned int i, j;

   for(i=0; i < length; i++) {
   byte = data_buffer[i];
   printf("%02x ", data_buffer[i]); // Display byte in hex.

   if(((i%16)==15) || (i==length-1)) {

   for(j=0; j < 15-(i%16); j++)
   printf(" ");
   printf("| ");

  for(j=(i-(i%16)); j <= i; j++) { // Display printable bytes from line.
   byte = data_buffer[j];

   if((byte > 31) && (byte < 127)) // Outside printable char range
    printf("%c", byte);

   else
    printf(".");
 }
   printf("\n"); // End of the dump line (each line is 16 bytes)

 } // End if
 } // End for

 }


int main() {
  struct pcap_pkthdr header;
  const u_char *packet;
  char errbuf[PCAP_ERRBUF_SIZE];
  char *device;
  pcap_t *pcap_handle;
  int i;
  device = "wlan0";


  printf("Sniffing on device %s\n", device);
  pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);


for(i=0; i < 3; i++) {
  packet = pcap_next(pcap_handle, &header);
  printf("Got a %d byte packet\n", header.len);
  dump(packet, header.len);
}

pcap_close(pcap_handle);

}

то, что я получаю в результате: Я компилирую gcc -o test test.c -l pcap и запускаю программу от имени пользователя root. Спасибо.


person Ojs    schedule 31.07.2015    source источник
comment
Вы когда-нибудь слышали об отступах кода?   -  person qrdl    schedule 31.07.2015
comment
Если возвращается NULL, errbuf заполняется соответствующим сообщением об ошибке.   -  person bishop    schedule 31.07.2015
comment
Извините, это pcap_next(), который возвращает null   -  person Ojs    schedule 31.07.2015


Ответы (1)


pcap_next() возвращает указатель на данные пакета в случае успеха и возвращает NULL, если произошла ошибка или если пакеты не были прочитаны из захвата в реальном времени (если, например, они были отброшены, потому что не прошли фильтр пакетов, или если на платформах, поддерживающих тайм-аут чтения, который начинается до прибытия каких-либо пакетов, этот тайм-аут истекает до прибытия каких-либо пакетов, или если файловый дескриптор для устройства захвата находится в неблокирующем режиме и никакие пакеты не были доступны для чтения), или если в ''savefile'' больше нет доступных пакетов. К сожалению, невозможно определить, произошла ли ошибка или нет.

http://linux.die.net/man/3/pcap_next

Так что может быть все в порядке. Я предлагаю проверить NULL, ничего не делать (или i--;) и перейти к следующему пакету. ИЛИ используйте pcap_next_ex() и проверьте наличие ошибки.
И возвращает ли pcap_open_live() действительный дескриптор? Пожалуйста, проверьте возвращаемое значение.

person robin.koch    schedule 31.07.2015
comment
И Linux, с достаточно новыми версиями libpcap и ядра, является [платформой], которая поддерживает тайм-аут чтения, который начинается до прибытия каких-либо пакетов, поэтому pcap_next() может возвращать NULL, даже если ошибок нет. pcap_next() по этой причине является плохой подпрограммой для использования, так как вы не можете обнаружить с ее помощью ошибки; вместо этого используйте pcap_next_ex(). - person ; 31.07.2015