x
• Status: Solved
• Priority: Medium
• Security: Public
• Views: 1290

# TCP checksum in delphi

Can anyone tell me if there is a Delphi version of this routine out there to calculate the TCP checksum

/*
**************************************************************************
Function: tcp_sum_calc()
**************************************************************************
Description:
Calculate TCP checksum
***************************************************************************
*/

typedef unsigned short u16;
typedef unsigned long u32;

u16 tcp_sum_calc(u16 len_tcp, u16 src_addr[],u16 dest_addr[], BOOL padding, u16 buff[])
{
u16 prot_tcp=6;
u16 word16;
u32 sum;

// Find out if the length of data is even or odd number. If odd,
// add a padding byte = 0 at the end of packet
buff[len_tcp]=0;
}

//initialize sum to zero
sum=0;

// make 16 bit words out of every two adjacent 8 bit words and
// calculate the sum of all 16 vit words
word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
sum = sum + (unsigned long)word16;
}
// add the TCP pseudo header which contains:
// the IP source and destinationn addresses,
for (i=0;i<4;i=i+2){
sum=sum+word16;
}
for (i=0;i<4;i=i+2){
sum=sum+word16;
}
// the protocol number and the length of the TCP packet
sum = sum + prot_tcp + len_tcp;

// keep only the last 16 bits of the 32 bit calculated sum and add the carries
while (sum>>16)
sum = (sum & 0xFFFF)+(sum >> 16);

// Take the one's complement of sum
sum = ~sum;

return ((unsigned short) sum);
}

Also how do I determine the len_tcp value and how do I get the buff[].
0
rayman3411
1 Solution

Author Commented:
I have answered my own question.
``````// Calculate TCP checkcum
function RERFilter.RecalculateTCPChecksum(aLen: Integer;
buff: PByteArray): Word;
type
Tbyte = array of byte;

var
i,sum: integer;

begin
sum := 0;
try
try
if (aLen div 2) * 2 <> aLen then begin
buff[aLen] := 0;
end;
i := 0;
while i < aLen+padd do begin
w16 := ((buff[i] shl 8)and \$FF00) + (buff[i+1]and \$FF);
sum := sum + integer(w16);
i := i + 2;
end;

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(aLen);

while (sum shr 16)>0 do
sum := (sum and \$FFFF)+(sum shr 16);
sum := not sum;
except on E : Exception do
MessageDlg('Error Calculating TCP Checksum.'+#10#13+
'Exception: '+E.Message, mtError, [mbOk], 0);
end;
finally
Result := sum;
end;
end;
``````
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

## Featured Post

Tackle projects and never again get stuck behind a technical roadblock.