nowky
驱动牛犊
驱动牛犊
  • 注册日期2003-02-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1405回复:4

请问各位大虾,校验和的求法(代码)

楼主#
更多 发布于:2003-03-31 16:03
因为想对数据包进行转发,没得办法

小弟不胜感激
jingshu
驱动牛犊
驱动牛犊
  • 注册日期2002-10-31
  • 最后登录2003-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-18 17:20
linux下源码不是有现成的函数可以调用吗,你看一下就可以了
leekeygz
驱动牛犊
驱动牛犊
  • 注册日期2002-11-12
  • 最后登录2004-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-18 17:58
typedef struct _IP_PACKET
{
unsigned char h_verlen;           //4位首部长度,
unsigned char tos;                //8位服务类型 unsigned char total_h;
unsigned char total_l;             //16位总长度
unsigned short ident;             //16位标识
unsigned short frag_and_flags;    //3位标志位和13
unsigned char  ttl;               //8位生存时间 unsigned char proto;              //8位协议 unsigned short checksum;       //16位IP首部校验和
unsigned char  sourceIP[4] ;     //32位源IP地址
unsigned char  destIP[4];       //32位目的IP地址
}IP_PACKET, *P_IP_PACKET;

USHORT checksum(USHORT *buffer, int size)
{
   unsigned long cksum=0;
   while(size>1)
   {
  cksum+=*buffer++;
  size-=sizeof(USHORT);
   }
   if (size)
   {
  cksum+=*(UCHAR *)buffer;
   }
   cksum=(cksum>>16)+(cksum & 0xffff);
   cksum+=(cksum>>16);
   return (USHORT)(~cksum);
}

int main()
{
  IP_HEADER  IPHdr;
  IPHdr.checksum=checksum((USHORT *)(&IPHdr));
  return 0;
}

其他校验一样
matcn
驱动牛犊
驱动牛犊
  • 注册日期2003-04-21
  • 最后登录2003-04-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-04-21 01:36
用笔算一下你就理解了。 也许结果不一样但效果是一样的。
nowky
驱动牛犊
驱动牛犊
  • 注册日期2003-02-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-24 12:08
谢谢回答,小弟已经解决了

不过又陷入另外一个问题,对服务器进行轮询

真是痛苦呀
游客

返回顶部