Для вычисления контрольной суммы UDP требуется UDP псевдозаголовок .
Вот несколько примеров кода из моих библиотек, которые могут помочь:
// SmartBuffer is a stream-like buffer class
uint16_t SmartBuffer::checksum(const void* buf, size_t buflen)
{
assert(buf);
uint32_t r = 0;
size_t len = buflen;
const uint16_t* d = reinterpret_cast<const uint16_t*>(buf);
while (len > 1)
{
r += *d++;
len -= sizeof(uint16_t);
}
if (len)
{
r += *reinterpret_cast<const uint8_t*>(d);
}
while (r >> 16)
{
r = (r & 0xffff) + (r >> 16);
}
return static_cast<uint16_t>(~r);
}
UDPFrame
вычисление контрольной суммы:
uint16_t UDPFrame::computeChecksum(const ipv4_header& ih) const
{
udp_pseudo_header uph;
memset(&uph, 0x00, sizeof(uph));
uph.source = ih.source;
uph.destination = ih.destination;
uph.mbz = 0x00;
uph.type = ih.protocol;
uph.length = getData()->length;
systools::SmartBuffer tmp(sizeof(uph) + d_data.size());
tmp.appendValue(uph);
tmp.append(d_data); // d_data is the UDP frame payload
return tmp.checksum();
}
В любом случае, имейте в виду, что обычно wireshark предупреждает вас, что неверное значение для контрольной суммы может быть вычислено из-за разгрузки контрольной суммы UDP .
Возможно, ваша функция контрольной суммы действительно неправильная, но надежный способ убедиться, что вы пытаетесь получить ваши кадры UDP.