IP校验和不对..
关键代码..
校验和的计算代码是从linux源码copy来的..应该不会错。
但是!
wireshark抓包永远是校验和错误的..whywhywhy....
typedef struct ip_hdr
{
/*unsigned char
version:4,
ihl:4;*/
unsigned char h_ver;
unsigned char tos;
unsigned short tot_len;
unsigned short id;
unsigned short
zero:1,
frag:1,
more_frag:1,
frag_off:13;
unsigned char ttl;
unsigned char protocol;
unsigned short checkSum;
unsigned long saddr;
unsigned long daddr;
/*The options start here. */
}IP_HEADER;
unsigned short checkSum(unsigned char * buff, int wlen)
{
unsigned long sum = 0;
if (wlen) {
unsigned long bogus;
__asm__("clc\n"
"1:\t"
"lodsl\n\t"
"adcl %3, %0\n\t"
"decl %2\n\t"
"jne 1b\n\t"
"adcl $0, %0\n\t"
"movl %0, %3\n\t"
"shrl $16, %3\n\t"
"addw %w3, %w0\n\t"
"adcw $0, %w0"
: "=r" (sum), "=S" (buff), "=r" (wlen), "=a" (bogus)
: "0" (sum), "1" (buff), "2" (wlen));
}
return (~sum) & 0xffff;
}
int IPGen(ip_hdr *hdr,unsigned long srcIP,unsigned long dstIP)
{
/*hdr->version=4;
hdr->ihl=5;//= =?*/
hdr->h_ver=(4<<4 | sizeof(ip_hdr)/sizeof(unsigned int));
hdr->tos=0;
hdr->tot_len=sizeof(ip_hdr)+sizeof(tcp_hdr);
hdr->id=0;
hdr->zero=0;
hdr->frag=0;
hdr->more_frag=0;
hdr->frag_off=0;
hdr->ttl=64;
hdr->protocol=IP_TCP;
hdr->saddr=srcIP,
hdr->daddr=dstIP;
hdr->saddr=htonl(hdr->saddr);
hdr->daddr=htonl(hdr->daddr);
hdr->tot_len=htons(hdr->tot_len);
hdr->checkSum=0;
hdr->checkSum=checkSum((char*)hdr,sizeof(ip_hdr));
return 0;
}
校验和的计算代码是从linux源码copy来的..应该不会错。
但是!

wireshark抓包永远是校验和错误的..whywhywhy....
...全文
相关推荐
IP、ICMP、UDP、TCP 校验和算法分享
主要是为探索一下这个校验和算法具体怎么实现的,需要的朋友可以参考下
IP校验和和UDP校验和代码
IP和UDP检验和代码,可以过课设的!简单易懂,就是源代码!
IP头校验和计算
用户填写IP头信息,点击计算校验和能得出校验和的值,可以配合抓包工具使用,校验比较一致。
TCP_IP协议的校验和计算源码
TCP_IP协议的校验和计算源代码 TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
UDP校验和算法
UDP校验和算法,给出了UDP校验和算法的C语言程序。


网络

