You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

libpcap抓包程序调用pcap_next触发段错误问题求助

段错误排查结果

核心触发原因

你声明的struct pcap_pkthdr *header是未初始化的野指针,没有指向合法的内存空间。pcap_next函数要求第二个参数必须指向一块调用者提前分配好的、足够容纳struct pcap_pkthdr结构体的内存,用于回写捕获数据包的元数据。你直接传入野指针后,后续访问header->len时会访问非法内存地址,直接触发段错误。

存在的其他潜在错误

pcap_open_live的返回值为pcap_t*类型,打开设备失败时返回NULL,你现有代码中if(pcap_handle < 0)的判断逻辑完全错误,指针与整数比较属于未定义行为,可能引发额外异常。

修复方案

代码改动点:

#include <pcap.h>
#include <stdlib.h>
#include <stdio.h>
#include "dump.h"

void pcap_fatal(const char *failed_in, const char *errbuf){
    printf("Fata Error in %s: %s\n", failed_in, errbuf);
    exit(1);
}

int main(){
    // 改为直接定义结构体变量,在栈上分配内存
    struct pcap_pkthdr header;
    const u_char *packet;
    char errbuf[PCAP_ERRBUF_SIZE];
    char *device;
    pcap_t *pcap_handle;
    int i;

    /*look for a device to capture packets*/
    device = pcap_lookupdev(errbuf);
    if(device == NULL)
        pcap_fatal("pcap_lookupdev", errbuf);
    printf("Sniffing on device %s\n", device);

    /*opens the packet capturing device*/
    pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);
    // 修正返回值判断逻辑,判断是否为NULL
    if(pcap_handle == NULL){
        printf("ERROR: while opening pcap device: %s\n", errbuf);
        exit(1);
    }

    for(i=0;i<3;i++){
        printf("\n===packet %d===\n", i+1);
        // 传入结构体的地址
        packet = pcap_next(pcap_handle, &header);
        // 增加返回值判断,避免空指针访问
        if (packet == NULL) {
            printf("Capture packet %d failed\n", i+1);
            continue;
        }
        printf("Got a %d byte packet\n", header.len);
        dump(packet, header.len);
    }
    
    pcap_close(pcap_handle);
    return 0;
}

额外注意事项

  • 抓包程序需要以root权限运行,否则pcap_open_live会返回打开失败
  • 增加pcap_next返回值判断,避免抓包超时或失败时返回的空指针传入dump函数引发其他崩溃

内容的提问来源于stack exchange,提问作者user14622805

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:06:03