我试图用C语言编写一个包嗅探程序,当我在成功编译后运行程序时,我遇到了一个分段错误。我试图通过注解掉一些代码并重新编译程序,然后重新运行较小版本的程序来确定导致程序分段错误的确切代码行。下面是我的代码。
void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
printf("Got a packet\n");
}
int main()
{
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
char filter_exp[] = "ip proto icmp";
bpf_u_int32 net;
// Step 1: Open live pcap session on NIC with name eth3
handle = pcap_open_live("eth3", BUFSIZ, 1, 1000, errbuf);
// Step 2: Compile filter_exp into BPF psuedo-code
pcap_compile(handle, &fp, filter_exp, 0, net);
pcap_setfilter(handle, &fp);
// Step 3: Capture packets
pcap_loop(handle, -1, got_packet, NULL);
pcap_close(handle); //Close the handle
return 0;
}
在注解掉代码并重新编译程序并重新运行程序之后,我发现segfault发生在pcap_compile
行:
pcap_compile(handle, &fp, filter_exp, 0, net);
当我编译并运行一个程序时,handle
(步骤1)行之后的所有内容都被注解掉了,程序运行时没有segfaulting,什么也没有发生。只要我在程序中包含pcap_compile
语句,使其成为活动语句,程序就会segfaults。有人知道问题所在吗,是pcap_compile
调用还是其他什么?
2条答案
按热度按时间zbsbpyhn1#
Steffen Ullrich在这里是100%正确的。
如果你要调用任何返回
pcap_t *
的例程,比如pcap_open_live()
,你必须通过检查它是否返回空指针来确保它成功:如果它失败并返回一个空指针,那么如果将空指针作为第一个参数传递给
pcap_compile()
,那么pcap_compile()
和其他libpcap例程将崩溃。如果注解掉对
pcap_open_live()
的调用,那么handle
不会被设置为任何值,因此它包含一个未知值。* 如果 * 该值 * 碰巧 * 指向内存中的一个位置,使得 * 如果 *pcap_compile()
、pcap_setfilter()
和pcap_loop()
没有发生崩溃,* 那么 * 它将 * 看起来 * 程序正在工作-但实际上并没有。所以你应该检查
pcap_open_live()
是否成功,就像上面的例子一样- * 和 * 你应该检查pcap_compile()
、pcap_setfilter()
和pcap_loop()
是否也成功。j9per5c42#
需要提醒的是,您调用的函数
pcap_open_live
的第一个参数是您的Linux的网络接口,所以您必须确保您的Linux有名为eth3的网络接口,您可以通过ifconfig -a
命令检查您的Linux的网络接口,如果您发现没有名为eth3的接口,那么问题可能就出在这里。