hier meine Routine:
Delphi-Quellcode:
Function CalcIPChecksum(Const Packet : Pointer;Const Bytes : LongWord) : Word;
Var
Checksum : LongWord;
X : Integer;
begin
Checksum:=0;
For X:=1 To (Bytes shr 1) Do Checksum:=Checksum + PWords(Packet)^[X - 1];
If ((Bytes and 1) > 0) Then Checksum:=Checksum + PBytes(Packet)^[Bytes - 1];
CheckSum:=(CheckSum shr 16) + (CheckSum and $FFFF);
CheckSum:=CheckSum + (CheckSum shr 16);
Result:=Word(not Checksum);
end;
die Checksumme wird von den ersten n Bytes des Packets berechnet, wobei n die Header-Länge gemäss
IP-Header ist.
Zu beachten ist:
- vor der Berechnung wird das Feld der Checksumme im
IP-Header auf $0000 gesetzt
- die Checksumme liegt im Packet in Network-Byte-Order vor.... mittels WinSock.NToHS lässt sich ein Word (S-hort) von Network-Byte-Order zu Host-Byte-Order wandeln (WinSock.HToNS für Gegenrichtung)