Ошибка сегментации при попытке назначить кадр ethh->h_dest в необработанном сокете C

#c #c #ethernet #raw-sockets

Вопрос:

Я пытаюсь создать необработанный сокет, и я построил структуру, в которой будут все заголовки : 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(amp;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-это указатель на символ, не выделенный или что-то в этом роде. Используя memset для его адреса, вы устанавливаете его значение равным 0, что означает нулевой указатель. Позже вы назначите его файлу frame_test.ethh и попытаетесь получить к нему доступ. Я полагаю, что именно в этом вы видите проблему.

Почему sendbuff является указателем на символ без знака, а не просто структурой типа
ethhdr? Кроме того, почему memset используется для 43 байт? Я бы изменил его на размер структуры ethhdr. После этого просто используйте frame_test.ethh = amp;отправить сообщение;

 
...
struct ethhdr srndbuff:
memset(amp;sendbuff, 0, sizeof(sendbuff));
...
frame_test.ethh = amp;sendbuff
...
 

Если вам нужно использовать его с неподписанным символом, то:

 
#DEFINE SIZE 43 /* or sizeof(struct ethhdr) */
...
unsigned char sendbuff[SIZE]; 
memset(sendbuff, 0, SIZE);
...
frame_test.ethh = (struct ethhdr *)(sendbuff);
...
 

Надеюсь, это поможет.

Комментарии:

1. Здесь вы, кажется, на правильном пути, но ваш ответ нуждается в улучшении. Это sendbuff , действительно, указатель, но он ни на что не указывает. Кроме того, amp; необходимо удалить в вызове memset . Возможно, подумайте о том, чтобы улучшить или переписать свой ответ, чтобы он действительно включал рабочее решение.

2. Спасибо, Адриан. Что-то новенькое в том, чтобы на самом деле писать ответы. Я постараюсь, чтобы это выглядело красивее. Добавил предложение.