Итак, я читаю пост Вот
И я наткнулся на этот блок кода
char packet[sizeof(icmphdr)];
memset(packet, 0, sizeof(packet));
icmphdr *pkt = (icmphdr *)packet;
Из того, что я понимаю, объявляется массив символов размером с icmphdr, и после этого он становится для меня неясным. Строка, следующая за этим, я даже не знаю, где начать интерпретировать это.
Посмотрите на определение типа для 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;
Конечно, если вы сделаете это, вы должны ДЕЙСТВИТЕЛЬНО быть осторожными с упаковкой структуры.