У меня есть следующая рабочая функция, которая принимает сокет, готовый для ответа ICMP, и считывает его в буфер, но я изо всех сил пытаюсь понять поток кода и хотел, чтобы кто-то исправил / подтвердил мое понимание. Насколько я понимаю, следующее:
- Указатель массива из 1024 символов, называемый «буфер», определен для использования в качестве буфера.
- Два указателя, называемые «ip» и «icmp», являютсясоздан для указания на структуры iphdr и icmphdr.
- Указатель 'ip' настроен так, чтобы указывать на указатель 'buffer', который теперь преобразуется в указатель структуры iphdr
- Указатель 'icmp'устанавливается указатель на буферный указатель + размер struct iphdr, который теперь преобразуется в указатель структуры icmphdr
Это четвертый момент, который я не совсем понимаю. Расположен ли адрес указателя 'icmp' под адресом указателя 'ip', а '(buff + sizeof (struct iphdr)) "ссылается на точку в памяти, на которую должен указывать указатель' icmp '? Могу ли я где-нибудь прочитать о приведении типов, используя этот тип смещения? `
int read_icmp_answer(int *sock){
char buff[1024];
struct iphdr *ip;
struct icmphdr *icmp;
ip = (struct iphdr *)buff;
icmp = (struct icmphdr *) (buff + sizeof(struct iphdr));
if(read(*sock, buff, sizeof(buff)) > 0) {
if(icmp->type == 0 && icmp->code == 0) return 1;
else return -1;
}
return 0;
}
`