//아래 함수를 제공해주신 분들께 무한한 감사를(__)
//이론은 체크섬치면 구성원리를 알 수 있다.
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 );
'C++' 카테고리의 다른 글
Raw소켓짤때 헤더(Header)와 프로토콜(Protocol) 작성규칙 (0) | 2016.12.15 |
---|---|
IPv6헤더 (0) | 2016.12.15 |
MySql/MariaDB 한글 깨짐 문제 해결방법(링크참조) (0) | 2016.12.15 |
단순검색구문에서 std::vector가아닌 std::set을 쓰는 예제 (0) | 2016.11.23 |
Mysql(5.5버전 혹은 그이상)에서 한글문자지원(캐릭터셋)세팅 (0) | 2016.11.17 |