#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. Спасибо, Адриан. Что-то новенькое в том, чтобы на самом деле писать ответы. Я постараюсь, чтобы это выглядело красивее. Добавил предложение.