我是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身份运行程序的方法。感谢。
答案 0 :(得分:1)
pcap_next()在成功时返回指向数据包数据的指针 如果发生错误,或者没有从a读取数据包,则返回NULL 实时捕获(例如,如果他们没有被丢弃,他们会被丢弃 传递数据包过滤器,或者,如果在支持读取的平台上传递 超时在任何数据包到达之前开始,超时到期 在任何数据包到达之前,或者如果是捕获的文件描述符 设备处于非阻塞模式,没有可用的数据包 读取),或者如果''savefile中没有更多的数据包可用。'' 不幸的是,无法确定是否发生错误 或不。
http://linux.die.net/man/3/pcap_next
所以它可以是好的。我的建议是检查NULL
,什么都不做(或i--;
)并继续下一个数据包。或者使用pcap_next_ex()
并检查错误
pcap_open_live()
甚至会返回一个有效的句柄吗?请检查返回值。