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
相关产品推荐
相关产品推荐

