现在要达到下面这么目的应用增量调整Checksum的算法调整TCPChecksum的值,避免了扫描整个
报文来计算Checksum的开销但是不知道 增量调整Checksum的算法 是怎么回事,能给个讲解或者文章的连接吗?多谢多谢!

解决方案 »

  1.   

    从别人那儿找来一个,贴出来,希望对后面人有用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;
    }
      

  2.   

    以下是我实现的修改校验和的两个函数,思路就是按照数据中一个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;
    }