получить заголовок ICMPv6 из пакета IPv6

Привет, я застрял на получении заголовка ICMPv6 из пакета IPv6.

        size = sizeof(sockaddr_in6);
if ((lenght = recvfrom(socd, buffer, BUFSIZE, 0, (sockaddr *)&receiveSockAddr, &size)) < 0) {
cerr << "recvfrom error" << endl;
}

ip = (ip6_hdr *) buffer;

cout << "Payload length: " << ip->ip6_ctlun.ip6_un1.ip6_un1_plen << endl;
cout << "Payload length ntohs: " << ntohs(ip->ip6_ctlun.ip6_un1.ip6_un1_plen) << endl;

//icmpRec = (icmp6_hdr *) (buffer + ???offset???);

Мне нужно выяснить, как установить смещение. Единственный способ, которым я знаю, это получить длину полезной нагрузки и затем: длина пакета — длина полезной нагрузки = мое смещение. Но в Ашд> ip6_ctlun.ip6_un1.ip6_un1_plen некоторые странные цифры.

Из кода выше я получаю:

Payload length: 25332
Payload length ntohs: 62562

после отправки ICMP6_ECHO_REQUEST на ipv6.google.com

Но если я смотрю в wireshark, длина полезной нагрузки составляет 8 байтов. Как правильно декодировать номер полезной нагрузки из uint16_t исправить десятичное число 8? И как получить полный размер пакета IPv6 для расчета смещения? Почему IPv6 не имеет IHL как IPv4? Это очень усложняет работу над IPv6.

2

Решение

Это может быть проблемой, хотя мне было немного трудно переварить.

Очевидно, заголовок IPv6 автоматически обрезается при использовании recvfrom ().

котировка

Для исходящих пакетов автоматически добавляется заголовок IPv6.
(на основе адреса назначения). Входящие пакеты на сокете
полученный с удаленным заголовком IPv6 и удаленными заголовками.

Страница руководства ipv6

Таким образом, в основном ваш буфер начинается с данных, а байты, которые вы смещаете, содержат некоторые случайные данные верхнего уровня.

2

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

Других решений пока нет …

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