增量调整Checksum的算法,谁能给点信息? 现在要达到下面这么目的应用增量调整Checksum的算法调整TCPChecksum的值,避免了扫描整个报文来计算Checksum的开销但是不知道 增量调整Checksum的算法 是怎么回事,能给个讲解或者文章的连接吗?多谢多谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 从别人那儿找来一个,贴出来,希望对后面人有用inline u_short in_cksum_replace(u_short uOrigSum, u_short uOldValue, u_short uNewValue){ u_long uSum = uOrigSum + uOldValue + (~uNewValue & 0xFFFF); uSum = (uSum >> 16) + (uSum & 0xFFFF); uSum += (uSum >> 16); return uSum;}inline u_short in_cksum_replace_long(u_short uOrigSum, u_long uOldValue, u_long uNewValue){ u_long uSum = uOrigSum; uNewValue = ~uNewValue; uSum += (uOldValue & 0xFFFF) + (uOldValue >> 16); uSum += (uNewValue & 0xFFFF) + (uNewValue >> 16); uSum = (uSum >> 16) + (uSum & 0xFFFF); uSum += (uSum >> 16); return uSum;} 以下是我实现的修改校验和的两个函数,思路就是按照数据中一个DWORD单位被修改,修改字段按照高地位求和,也就是tcp/ip协议中的把被检验的相邻字节成对配成16 bit整数。注意这里第一个函数getChecksum返回的不是反码求和,因为需要对修改前和修改后的数据都求和,也就没必要求反码和了(其实是我对反码等等比较糊涂)。第二个函数就是修改前后的数据校验和求差。这里用ck0-ck1就是为了保证所返回的是反码校验和。我是自己根据协议摸索着做的,请达人们看到表笑,还要多多指点批评。unsigned short getChecksum(unsigned int *address){ unsigned short ck ; unsigned int addr = *address ; ck = (unsigned short)(addr >> 16) + (unsigned short)(addr&0xffff); return ck;}//addr0,指向原数据,addr1指向修改后数据,ck指向TCP/IP协议校验和void fixChecksum( unsigned int *addr0 , unsigned int *addr1 , unsigned short *ck ){ unsigned short ck0 = getChecksum( addr0 ); unsigned short ck1 = getChecksum( addr1 ); *ck += ck0 - ck1;} MFC怎么获取时间戳? EVC编绎优化问题 求助,关于WinINet Http通信 我想做一个word浏览器,能不能实现,用什么技术 刚刚多了一个角,问题是为什么我的可用分没有增加呢? 有没有办法得知某个正在Listen的Socket端口一共开多少个Socket Handle 这里人气值高,请多帮忙,谢谢,解决问题一并结帐,在线 我要做个相当于netmeeting的桌面共享的程序,难度有多大? 线上求助 MFC下的OCX,在IE中全屏 关于WH_CALLWNDPROC和WH_GETMESSAGE的问题 在内存中创建图形 再在窗体上显示出来
u_short uOldValue,
u_short uNewValue)
{
u_long uSum = uOrigSum + uOldValue + (~uNewValue & 0xFFFF);
uSum = (uSum >> 16) + (uSum & 0xFFFF);
uSum += (uSum >> 16);
return uSum;
}inline u_short in_cksum_replace_long(u_short uOrigSum,
u_long uOldValue,
u_long uNewValue)
{
u_long uSum = uOrigSum;
uNewValue = ~uNewValue;
uSum += (uOldValue & 0xFFFF) + (uOldValue >> 16);
uSum += (uNewValue & 0xFFFF) + (uNewValue >> 16);
uSum = (uSum >> 16) + (uSum & 0xFFFF);
uSum += (uSum >> 16);
return uSum;
}
我是自己根据协议摸索着做的,请达人们看到表笑,还要多多指点批评。
unsigned short getChecksum(unsigned int *address)
{ unsigned short ck ;
unsigned int addr = *address ;
ck = (unsigned short)(addr >> 16) + (unsigned short)(addr&0xffff);
return ck;
}
//addr0,指向原数据,addr1指向修改后数据,ck指向TCP/IP协议校验和
void fixChecksum( unsigned int *addr0 , unsigned int *addr1 , unsigned short *ck )
{
unsigned short ck0 = getChecksum( addr0 );
unsigned short ck1 = getChecksum( addr1 );
*ck += ck0 - ck1;
}