#include <stdio.h>
#include <string.h>
#define DATA_MAX_LEN 14 /* 最大数据长度 */
struct data_sum
{
char data[DATA_MAX_LEN]; /* 数据 */
unsigned short checksum; /* 校验和 */
};
unsigned short ip_checksum(unsigned short *buf, int buf_len)
{
unsigned long checksum = ;
while (buf_len > )
{
checksum += *buf++;
buf_len -= sizeof(unsigned short);
}
if (buf_len)
{
checksum += *(unsigned char *)buf;
}
checksum = (checksum >> ) + (checksum & 0xffff);
checksum += (checksum >> );
return (unsigned short)(~checksum);
}
int main(int argc, char **argv)
{
struct data_sum msg = { "adddddaa", };
int length = sizeof(msg);
printf("length = %d\n",length);
/* checksum = 0, 计算校验和 */
msg.checksum = ip_checksum((unsigned short *)&msg, length);
printf("Calculate check sum : 0x%x\n", msg.checksum);
/* 包含 checksum 值, 验证校验和 */
msg.checksum = ip_checksum((unsigned short *)&msg, length);
printf("Verify check sum : 0x%x\n", msg.checksum);
msg.data[]='w';
/* 包含 checksum 值, 验证校验和 因为改变了其值,校验和不为0 */
msg.checksum = ip_checksum((unsigned short *)&msg, length);
printf("Verify check sum : 0x%x\n", msg.checksum);
return ;
}