Em dùng wireshark để bắt 1 gói tin tcp, xem thì thấy ip header của nó thế này: 45 00 00 30 2a 31 40 00 80 06 4d 43 c0 a8 01 02 c0 a8 01 01
4d 43 là checksum
Em dùng code này để tính checksum (đã thay 4d 43 = 00 00)
Code:
unsigned short in_cksum(unsigned short * addr, int len)
{
int nleft = len;
unsigned short *w = addr;
int sum = 0;
unsigned short answer = 0;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(BYTE *) (&answer) = *(BYTE *) w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return (answer);
}
Nhưng nó lại không ra là 4d 43. Có phải code trên bị sai ko ??