c - 为什么我的程序不能与不同的 Linux 发行版一起工作?

标签 c segmentation-fault pcap sniffer

我正在研究数据包嗅探器。 最大的问题是我的代码只能在 Backtrack 5 R3 下完美运行,但在其他发行版下却无法运行!事实上,在 Ubuntu 12.10 和 ArchLinux 上,当嗅探器获得第一个数据包时,我遇到了段错误(我得到“段错误核心转储”)。起初,我认为是库或编译器的问题,但经过一些测试,我认为我可以排除它们!情况是这样的:

  • Backtrack 5 R3 使用 gcc 4.4.3 和 libpcap 1.0.0
  • Ubuntu 12.10 使用 Gcc 4.7.2 和 Libpcap 1.3.0
  • ArchLinux 与 Ubuntu 相同

所以我尝试将 Arch 降级到 gcc 4.4.3 e libpcap 1.0.0,但我得到了同样的错误。 我在编译代码时有一些警告,但没有什么真正重要的,但是它在回溯下完美运行!这就是最大的谜团。

这是导致问题的代码:

void packet_dump(unsigned char *arguments, const struct pcap_pkthdr *pcap_data, const unsigned char *packet) {
    int packet_data_len, tcp_header_size=0, total_header_size;
    unsigned char *packet_data;
    const unsigned char *ip_src_dest;
    const struct header_ip *ip_header; 

    //Calculate the value of variables
    ip_src_dest = (packet+LUNGHEZZA_INTESTAZIONE_ETH); 
    ip_header = (const struct header_ip *)ip_src_dest; 
    total_header_size = LUNGHEZZA_INTESTAZIONE_ETH+sizeof(struct header_ip)+tcp_header_size;
    packet_data = (unsigned char *)packet + total_header_size;  
    packet_data_len = pcap_data->len - total_header_size;

    //THIS CAUSE THE PROBLEM (Solved removing inet_ntoa and converting it manually)
    printf("[ %s ] ============> ", inet_ntoa(ip_header->source_addr_ip));
    printf("[ %s ]  \n", inet_ntoa(ip_header->destination_addr_ip));


}

最佳答案

我怀疑您的程序正在崩溃,因为 ip_header->source_addr_ip 指向不允许您访问的内存。您应该能够使用 GDB以确定是否属于这种情况。

关于c - 为什么我的程序不能与不同的 Linux 发行版一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13610671/

相关文章:

java - 来自 Java 的 PCAP 纳秒分辨率

c - 带有指针的意外结果

c - IAR 嵌入式 IDE - 更改板支持

c - 使用 execl 重定向 ls

c - GTK gtk_label_set_text 段错误

c - 段错误(核心转储)字符数组

linux - x86 内存访问段错误

c - 如何使用c从目录访问多个离线pcap文件并捕获源ip地址

c - 为什么我们将 -lpcap 与 gcc 一起使用,这是什么意思?

c - 在c中切片数组或结构的函数