Что делает этот пакет icmphdr * pkt = (icmphdr *); имею в виду?

Итак, я читаю пост Вот
И я наткнулся на этот блок кода

char packet[sizeof(icmphdr)];
memset(packet, 0, sizeof(packet));

icmphdr *pkt = (icmphdr *)packet;

Из того, что я понимаю, объявляется массив символов размером с icmphdr, и после этого он становится для меня неясным. Строка, следующая за этим, я даже не знаю, где начать интерпретировать это.

0

Решение

Посмотрите на определение типа для icmphdr, Фактически вы убеждаете компилятор в том, что ваш массив char (byte) на самом деле является структурой icmphdr (я предполагаю). Это означает, что вы можете читать необработанные байты в массив, а затем обращаться к различным частям этого массива, как если бы они были структурой.

Так скажем, что icmphdr определяется как:

typedef struct
{
int sequence_number;
int data_size;
bool fragment;
} icmphdr;

Это означает, что вы затем делаете:

read(socket_fd, packet, sizeof(icmphdr));

И тогда вы можете делать такие вещи, как:

int sequence= packet->sequence_number;

Конечно, если вы сделаете это, вы должны ДЕЙСТВИТЕЛЬНО быть осторожными с упаковкой структуры.

1

Другие решения


По вопросам рекламы [email protected]