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()
      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 padd=0;
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
      if (padding&1==1){
      //initialize sum to zero
      // make 16 bit words out of every two adjacent 8 bit words and
      // calculate the sum of all 16 vit words
      for (i=0;i<len_tcp+padd;i=i+2){
            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){
            word16 =((src_addr[i]<<8)&0xFF00)+(src_addr[i+1]&0xFF);
      for (i=0;i<4;i=i+2){
            word16 =((dest_addr[i]<<8)&0xFF00)+(dest_addr[i+1]&0xFF);
      // 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[].
Who is Participating?
rayman3411Connect With a Mentor Author Commented:
I have answered my own question.
// Calculate TCP checkcum
function RERFilter.RecalculateTCPChecksum(aLen: Integer;
                                          aSrcAddr, aDstAddr: Cardinal;
                                          buff: PByteArray): Word;
  Tbyte = array of byte;
  w16,padd: word;
  i,sum: integer;
  sIP,dIP: in_addr;
  padd := 0;
  sum := 0;
      if (aLen div 2) * 2 <> aLen then begin
        padd := 1;
        buff[aLen] := 0;
      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;
      //add IP length
      sIP := in_addr(aSrcAddr);
      dIP := in_addr(aDstAddr);
      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);
    Result := sum;

Open in new window

All Courses

From novice to tech pro — start learning today.