//아래 함수를 제공해주신 분들께 무한한 감사를(__)

//이론은 체크섬치면 구성원리를 알 수 있다.


unsigned short csum (unsigned short *buf, int nwords) {

    unsigned long sum=0;

    for( sum=0; nwords > 0; nwords-- ){
        sum += *buf++;
    }

    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);

    return (unsigned short)~sum;

}

다음함수 이용해서 계산


IP경우 일반적으로 홀수바이트일경우+1 패딩주고 짝수면 그냥계산 주의할점은 short 기준이므로length를 /2해서 넘겨야됌


일반적인 IP의 length의경우 20바이트이므로 20바이트그대로 복사해서 체크섬계산 (pseudo header불필요)


tcp는 의사헤더가 따로 필요 구글찾아보기

udp의 경우 플래그걍끄면 체크섬계산안해도됨 ㅋㅋㅋㅋ



//예제



 memcpy(ip_header_cksum, pIpHd, 20);

 pIpHd->crc =  csum( ip_header_cksum, 10 );//check  ip sum

 tcphd->crc =  0x00; //zero
 tcplen = (htons(pIpHd->tlen)-20);
 memcpy(&tcp_header_cksum[0], &pIpHd->saddr , 4);
 memcpy(&tcp_header_cksum[2], &pIpHd->daddr , 4);
 tcp_header_cksum[4] = htons(0x06);
 tcp_header_cksum[5] = htons(tcplen);
 memcpy(&tcp_header_cksum[6],(char *)tcphd,tcplen);


 //홀수 padding
 if( (tcplen%2) == 0)
 {
  tcpcklen = tcplen/2 ;
 }
 else
 {
  tcpcklen = (tcplen/2)+1 ;

 }
 tcphd->crc = csum( tcp_header_cksum, tcpcklen+6 );

+ Recent posts