Вычисление контрольной суммы пакета ICMP

Я пишу простую программу для отправки и получения сообщений ICMP.
Я написал следующее, чтобы вычислить контрольную сумму для сообщения icmp:

char sbuf[] = "        This is a test message..";
sbuf[0] = 0x10;
sbuf[1] = 0x00;
sbuf[2] = 0x00;
sbuf[3] = 0x00;
sbuf[4] = 0x00;
sbuf[5] = 0x00;
sbuf[6] = 0x00;
sbuf[7] = 0x00;
for (int i = 0; i < sizeof(sbuf); i += 2)
checksum += (sbuf[i] << 8) + sbuf[i + 1];

if (sizeof(sbuf) % 2)
checksum += sbuf[sizeof(sbuf) - 1] << 8;
checksum = (checksum >> 16) + (checksum & 0xffff);
checksum = ~(checksum + (checksum >> 16));
sbuf[2] = checksum >> 8;
sbuf[3] = checksum & 0x00ff;

Проблема в том, что вычисленная контрольная сумма не верна, когда длина сообщения нечетное число.
Что-то не так с checksum += sbuf[sizeof(sbuf) - 1] << 8; часть, но я не могу понять, что

Как это исправить?

Спасибо

0

Решение

Так что я думаю, что нашел решение.

for (int i = 0; i < sizeof(sbuf) - 1; i += 2)
checksum += (sbuf[i] << 8) + sbuf[i + 1];

if (sizeof(sbuf) % 2)
checksum += sbuf[sizeof(sbuf) - 1];

Теперь это вычисляет правильную контрольную сумму для любой длины messege. Но я не могу подтвердить, является ли это реальным решением или оно просто работает, потому что последний байт моего сообщения всегда равен нулю.

0

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

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

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