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

C++原始套接字赋值ethh->h_dest时出现Segmentation fault问题求助

段错误根因

你的代码触发段错误的核心原因是指针未初始化+memset调用错误,具体问题点如下:

  • unsigned char* sendbuff仅声明了一个栈上的指针变量,未指向任何合法可写的内存空间。
  • memset(&sendbuff,0,43)属于严重用法错误:&sendbuff取的是指针变量自身的栈地址,指针变量本身仅占4字节(32位系统)或8字节(64位系统),你直接从该地址开始写入43字节,首先会造成栈溢出覆写栈上其他数据,同时会把sendbuff本身的值清零为NULL。
  • 后续你把frame_test.ethh赋值为NULL,再尝试写入frame_test.ethh->h_dest[i],相当于直接访问NULL地址的偏移内存,直接触发段错误。
修复方案

方案1:复用结构体内置缓冲区(推荐)

你自定义的Network_frame_test结构体中已经定义了buffer数组作为缓冲区,直接使用即可,不需要额外定义sendbuff:

// 删掉原有unsigned char* sendbuff;和错误的memset调用
memset(frame_test.buffer, 0, SIZE_BUFFER);
// 把ethh指向结构体内置的缓冲区
frame_test.ethh = (struct ethhdr *)frame_test.buffer;

方案2:给sendbuff分配合法堆内存

如果你需要单独使用sendbuff,要先给它分配足够的可写内存:

// 按你需要的缓冲区大小分配,示例用你之前写的43字节
unsigned char* sendbuff = (unsigned char*)malloc(43);
if(sendbuff == NULL) {
  perror("内存分配失败");
  return -1;
}
// 注意memset第一个参数是sendbuff本身,不是&sendbuff
memset(sendbuff, 0, 43);

// 程序退出前记得释放内存,避免泄漏
free(sendbuff);
其他注意事项
  • 后续操作多协议头报文时,要注意内存对齐问题,建议给自定义协议结构体添加__attribute__((packed))修饰,避免编译器自动插入对齐字节导致协议字段错位。
  • 原始套接字程序需要root权限运行,否则会无权操作套接字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:54:02