Привет, я застрял на получении заголовка 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.
Это может быть проблемой, хотя мне было немного трудно переварить.
Очевидно, заголовок IPv6 автоматически обрезается при использовании recvfrom ().
котировка
Для исходящих пакетов автоматически добавляется заголовок IPv6.
(на основе адреса назначения). Входящие пакеты на сокете
полученный с удаленным заголовком IPv6 и удаленными заголовками.
Таким образом, в основном ваш буфер начинается с данных, а байты, которые вы смещаете, содержат некоторые случайные данные верхнего уровня.
Других решений пока нет …