WinSock网络编程学习(二)计算校验和程序 |
您所在的位置:网站首页 › winsock编程 › WinSock网络编程学习(二)计算校验和程序 |
⽹络编程学习(⼆)计算校验和程序 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 |