PLEASE Can any one help me? i try to tranlate VC’s source code of calculte tcp checksum to delphi but it dosn’t work like i expect.
procedure TTimerThread.CalcTCPchekSum(pBuffer: INTERMEDIATE_BUFFER);
type
Tbyte = array of byte;
var
pIPHeader: TIPHeaderPtr;
pTCPHeader: TTCPHeaderPtr;
w16,padd: word;
i,sum: integer;
dwTcpLen: DWORD;
IPProtocol,HL: Byte;
buff: Tbyte;
sIP,dIP: in_addr;
begin
padd := 0; sum := 0;
pIPHeader := TIPHeaderPtr(@Buffer.m_IBuffer[MHdrSize+1]);
IPProtocol := pIPHeader.Protocol;
if IPProtocol = IPPROTO_TCP then begin
HL := (pIPHeader.VerLen and $0F);
pTCPHeader := TTCPHeaderPtr(@Buffer.m_IBuffer[(MHdrSize+1)+(4*HL)]);
end else exit;
dwTcpLen := ntohs(pIPHeader.TotalLen) – (4*HL);
if (dwTcpLen div 2)*2 <> dwTcpLen then begin
padd := 1;
Buffer.m_IBuffer[dwTcpLen + (4*HL) + MHdrSize+1] := 0;
end;
buff := Tbyte(@Buffer.m_IBuffer[(MHdrSize+1)+(4*HL)]);
Memo1.Lines.Add(‘oldTCPchecksum = ‘+IntToStr(pTCPHeader.Checksum));
for i:=0 to dwTcpLen+padd-1 do begin
w16 := ((buff[i*2] shl 8)and $FF00) + (buff[i*2+1]and $FF);
sum := sum + integer(w16);
end;
//add IP length
sIP := in_addr(pIPHeader.SourceIp);
dIP := in_addr(pIPHeader.DestIp);
sum := sum + ntohs(sIP.S_un_w.s_w1) + ntohs(sIP.S_un_w.s_w2);
sum := sum + ntohs(dIP.S_un_w.s_w1) + ntohs(dIP.S_un_w.s_w2);
sum := sum + IPPROTO_TCP + word(dwTcpLen);
while (sum shr 16)>0 do
sum := (sum and $FFFF)+(sum shr 16);
sum := not sum;
Memo1.Lines.Add(‘TCPchecksum = ‘+IntToStr(ntohs(word(sum))));
end;