尝试在 C++ 原始套接字上分配帧 ethh->h_dest 时出现分段错误
Posted
技术标签:
【中文标题】尝试在 C++ 原始套接字上分配帧 ethh->h_dest 时出现分段错误【英文标题】:Segmentation fault when trying to assign frame ethh->h_dest on C++ Raw socket 【发布时间】:2021-12-14 10:28:24 【问题描述】:我正在尝试构建一个原始套接字,并且我已经构建了一个结构来包含每个标头:ETH、IP 等。 我刚开始分配 ETH 字段,但是当我只运行这部分代码时,出现分段错误:
typedef struct Network_frame_test
unsigned char dst_mac_addr[CONF_MAC_ADDRESS_SIZE];
unsigned char src_mac_addr[CONF_MAC_ADDRESS_SIZE];
struct ethhdr *ethh;
struct iphdr *iph;
struct udphdr *udph;
unsigned char buffer[ SIZE_BUFFER ];
Network_frame_test;
int main(void)
Network_frame_test frame_test;
const unsigned char message[] = 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a';
int message_size = sizeof(message)/sizeof(message[0]);
printf("messge size : %d", message_size);
unsigned char* sendbuff;
printf(" message %.2x", message[0]);
memset(&sendbuff,0,43);
printf(" %d", 0);
for(int i=0;i<6;i++)
frame_test.dst_mac_addr[i] = message[i+6];
frame_test.ethh = (struct ethhdr *)(sendbuff);
for(int i=0; i<CONF_MAC_ADDRESS_SIZE; i++)
frame_test.ethh->h_dest[i] = frame_test.dst_mac_addr[i];
【问题讨论】:
【参考方案1】:sendbuff 是指向 char 的指针,未分配或其他任何内容。通过在其地址上使用 memset,您将其值设置为 0,这意味着一个空指针。稍后您将其分配给 frame_test.ethh,并尝试访问它。我相信这就是您看到问题的地方。
为什么 sendbuff 是一个无符号字符指针而不是简单的类型 结构 ethhdr? 另外,为什么 memset 用于 43 个字节?我将其更改为 struct ethhdr 的大小。 之后,只需使用 frame_test.ethh = &sendbuff;
...
struct ethhdr srndbuff:
memset(&sendbuff, 0, sizeof(sendbuff));
...
frame_test.ethh = &sendbuff
...
如果你必须将它与 unsigned char 一起使用,那么:
#DEFINE SIZE 43 /* or sizeof(struct ethhdr) */
...
unsigned char sendbuff[SIZE];
memset(sendbuff, 0, SIZE);
...
frame_test.ethh = (struct ethhdr *)(sendbuff);
...
希望对您有所帮助。
【讨论】:
您似乎在正确的轨道上,在这里,但您的答案需要改进。sendbuff
确实是一个指针,但它不指向任何东西。此外,&
需要在对 memset
的调用中删除。也许考虑改进或重写您的答案,以便它实际上包含一个可行的解决方案。
谢谢,阿德里安。实际写答案有点新。我会努力让它看起来更漂亮。添加了一条建议。以上是关于尝试在 C++ 原始套接字上分配帧 ethh->h_dest 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章