尝试在 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 确实是一个指针,但它不指向任何东西。此外,&amp; 需要在对 memset 的调用中删除。也许考虑改进或重写您的答案,以便它实际上包含一个可行的解决方案。 谢谢,阿德里安。实际写答案有点新。我会努力让它看起来更漂亮。添加了一条建议。

以上是关于尝试在 C++ 原始套接字上分配帧 ethh->h_dest 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

Python 原始套接字 (Windows):嗅探以太网帧

原始套接字的学习和问题

python 分组并迭代数据帧,将值分配到列表,然后与原始值合并

C++:编译器如何知道为每个堆栈帧分配多少内存?

用于在以太网帧上添加自定义协议的以太网类型

原始 UDP 套接字卡在 recvfrom 上