C:libpcap不捕获wlan0数据包

时间:2015-07-31 13:18:34

标签: c wireless pcap libpcap packet-capture

我是C的新手并且很少有些困惑。我已经阅读了一些关于这个问题的话题,但没有一个对我有用。我试图用libpcap捕获wlan0数据包,但出了点问题。 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);

}

我得到的输出是什么在设备上嗅探wlan0
得到一个0字节的数据包
得到一个0字节的数据包
得到一个0字节的数据包
这就是我编译 gcc -o test test.c -l pcap 并以root身份运行程序的方法。感谢。

1 个答案:

答案 0 :(得分:1)

  

pcap_next()在成功时返回指向数据包数据的指针   如果发生错误,或者没有从a读取数据包,则返回NULL   实时捕获(例如,如果他们没有被丢弃,他们会被丢弃   传递数据包过滤器,或者,如果在支持读取的平台上传递   超时在任何数据包到达之前开始,超时到期   在任何数据包到达之前,或者如果是捕获的文件描述符   设备处于非阻塞模式,没有可用的数据包   读取),或者如果''savefile中没有更多的数据包可用。''   不幸的是,无法确定是否发生错误   或不。

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

所以它可以是好的。我的建议是检查NULL,什么都不做(或i--;)并继续下一个数据包。或者使用pcap_next_ex()并检查错误 pcap_open_live()甚至会返回一个有效的句柄吗?请检查返回值。