Winsock 入门 计算校验和 示例

时间:2023-03-09 07:08:41
Winsock 入门 计算校验和 示例
 #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 ;
}