阅读:1405回复:4
请问各位大虾,校验和的求法(代码)
因为想对数据包进行转发,没得办法
小弟不胜感激 |
|
沙发#
发布于:2003-04-18 17:20
linux下源码不是有现成的函数可以调用吗,你看一下就可以了
|
|
板凳#
发布于: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; } 其他校验一样 |
|
地板#
发布于:2003-04-21 01:36
用笔算一下你就理解了。 也许结果不一样但效果是一样的。
|
|
地下室#
发布于:2003-04-24 12:08
谢谢回答,小弟已经解决了
不过又陷入另外一个问题,对服务器进行轮询 真是痛苦呀 |
|