checksum

摘要:
unsignedshortchecksum(unsignedshort*usBuf,unsignedtnSize){unsignedlongusChksum=0;//计算校验和(nSize˃1){usChksum+=*usBuf++;nSize-=sizeof(unsigned short);}//如果我们有一个charliftif(n尺寸)u


unsigned short checksum(unsigned short* usBuf, unsigned int nSize)
{
 unsigned long usChksum=0;

 //Calculate the checksum
 while (nSize>1)
 {
  usChksum+=*usBuf++;
  nSize-=sizeof(unsigned short);
 }

 //If we have one char left
 if (nSize)
  usChksum+=*(unsigned char*)usBuf;

 //Complete the calculations
 usChksum=(usChksum >> 16) + (usChksum & 0xffff);
 usChksum+=(usChksum >> 16);

 //Return the value (inversed)
 return (unsigned short)(~usChksum);

}

ip部分
ippacket.GetIpHeader()->check=0;

checksum((unsigned short *)ippacket.GetIpHeader(),sizeof(iphdr)); 

UDP需要加入伪首部,再计算校验和

 PseudoHeader ph;

ph.dwSrcIP = ippacket.GetIpHeader()->saddr;
ph.dwDestIP = ippacket.GetIpHeader()->daddr;
ph.cReserved = 0;
ph.cProtocol = IPPROTO_UDP;
ph.wLength = htons((WORD)ntohs( ippacket.GetUdpHeader()->uh_ulen));
ippacket.GetUdpHeader()->uh_sum=0;
ippacket.GetUdpHeader()->uh_sum=checksumudp(&ph,(unsigned short *)ippacket.GetUdpHeader(),ntohs( ippacket.GetUdpHeader()->uh_ulen));

免责声明:文章转载自《checksum》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java常用的中间件Nginx日志运维笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

fopen,fwrite,fread使用

fopen, fwrite, fread详解 1、头文件 #include <stdio.h> 2、fopen (1) 函数原型 FILE *fopen(char *filename, *type) 函数用来打开一个文件 (2) 参数解析 filename,文件名 type,打开方式   字符及其含义:   打开方式由r,w,a,t,b...

Java虚拟机14:Java对象大小、对象内存布局及锁状态变化

一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法。不过还好,在JDK1.5之后引入了Instrumentation类,这个类提供了计算对象内存占用量的方法。至于具体Instrumentation类怎么用就不说了,可以参看这篇文章如何精确地测量java对象的大小。 不过有一点不同的...

C语言 屏幕截图 (GDI)

截取全屏幕 #include <windows.h> voidecho(CHAR*str); intCaptureImage(HWNDhWnd, CHAR*dirPath, CHAR*filename); intmain() { echo(TEXT("Ready")); CaptureImage(GetDesktopWindo...

006.udp转发包并代理访问服务器总结

背景: 当加速器(client)拦截了游戏客户端发送的完整数据包(package)时,将package传给中间服务器(mid_server),经过自己的链路传输数据之后,中间服务器模拟游戏客户端将数据发给游戏服务器(end_server),目的服务器收到请求后回应,回应的包以同样的方式返回,直到游戏客户端收到数据包。 原理及实现: 1.我们需要三个主机来...

C语言中查看类型的大小(占几个byte)

/*sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小。 C99和C11提供%zd转换说明匹配sizeof的返回类型[2]。 一些不支持C99和C11的编译器可用%u或%lu代替%zd *//* typesize.c -- 打印类型大小(单位是字节) */ #include <stdio.h> int main(void) {...

《C++ Qt设计模式》 第一章 C++ 简介

第1 章 C++简介 内容: 编译相关     Qt提供了一个qmake工具,它会产生Makefile 文件。使用qmake -project 命令产生一个简单的工程文件。当执行这个命令时,qmake 会将当前工作目录下的全部源文件作为SOURCES列出来,而将全部头文件作为HEADERS 列出来     使用make 重新编译那些发生了变化的文件,或...