Добрый день господа.
У меня возникла проблема в подсчёте чек суммы IP пакета перед отправкой.
Вот функция:
function Checksum(var Buffer; Size: word): WORD;
var i: Integer;
Sum: DWORD;
p: PWORD ;
begin
p:=@Buffer;
Sum := 0;
for i := 0 to Size - 1 do
begin
Sum := Sum + htons(p^);
inc(p);
end;
while (Sum shr 16) > 0 do
Sum := (Sum and $FFFF)+(Sum shr 16);
Sum := not Sum;
Result := Sum;
end;
Вроде должно работать правильно, но в итоге тем же самым WireShark'ом , мы замечаем:
Checksum: 0x4b28 [incorrect, should be 0x284b (maybe caused by "UDP checksum offload"?)]
или
Checksum: 0x7728 [incorrect, should be 0x2877 (maybe caused by "UDP checksum offload"?)]
Есть у кого-нибудь догадки : что я сделал не так ? =)
(искал другие функции, но найти подобный рабочий вариант у меня не получилось)