WinSock网络编程学习(二)计算校验和程序

您所在的位置:网站首页 winsock编程 WinSock网络编程学习(二)计算校验和程序

WinSock网络编程学习(二)计算校验和程序

2022-12-31 04:40| 来源: 网络整理| 查看: 265

⽹络编程学习(⼆)计算校验和程序

IP数据报⾸部的校验和,⽤于检验⾸部的有效性和完整性。校验和的计算是⾸部校验和字段置0,把⾸部看成是16⽐特的整数序列,计算每

个16为整数的反码,再求它们的和,最后计算结果的反码⽽求出。这是⼀个简单的校验和算法,实验证明它是合适的。数据报⾸部发⽣变

化时,如减少TTL、增加或改变选项、发⽣分⽚等,要重新计算校验和。

收到IP数据报时,使⽤同样的算法计算校验和,由于接收⽅计算校验和时包含了发送⽅保存在⾸部中的校验和,如果在传输过程中没有发⽣

差错,接收⽅计算的结果应该是0.如果不是0,接收⽅默默地抛弃收到的数据报,不产⽣差错信息。

校验和只包含⾸部,⽽不对数据部分检验,带来的好处是:⾸部⼀般都⽐数据少,在主机或路由器处理数据报时,减少了计算时间;另外,

允许⾼层协议选择⾃⼰的检验和算法,在可靠性⾼的⽹络上,甚⾄可以不对数据校验,⽐较灵活。

个⼈感觉计算机⽹络是⾮常复杂的,实现起来也很有挑战性,⽐如MMORPG的服务器。⽐较基础的⾸先是要理解协议存在的意义。协议,

就是标准,没了标准,世界就乱了,呵呵。计算机⽹络⾥⾯协议是⾮常多的,TCP,IP,UDP,FTP,ICMP,IGMP,PPP,HTTP,SMTP,ARP.....太

多了。后⾯我再对书中的这些协议进⾏⼀个总结归纳吧。《winsock⽹络编程经络》,推荐⼤家看看。

Check.c:

#include

#include

#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 = 0;

 while(buf_len > 1)

 {

  printf("buf = %d",*buf);

  checksum += *buf++; 

  printf("checksum = %d",checksum);

  

  buf_len -=sizeof(unsigned short); 

  printf("\n%d\n",buf_len);

 }

 if(buf_len)//

  checksum += *(unsigned char*)buf;

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

 checksum += (checksum >> 16);

 return (unsigned short)(~checksum);

}

void main(int argc,char **argv)

{

 char t;

 struct data_sum msg = {"hello world!",0};

 int length = sizeof(msg);

 printf("%d ,%d",length,sizeof(unsigned short));//16,2

 msg.checksum = ip_checksum( (unsigned short*)&msg,length);

 printf("Canculate checksum:0x%x, %d = \n",msg.checksum,msg.checksum);

 msg.checksum = ip_checksum( (unsigned short*)&msg,length);

 printf("Verify chcek sum:0x%x\n",msg.checksum);

// return 0;

 t = scanf("%c",&t);

}



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3