这整个包:
00 E0 61 13 E0 BA 00 21 9B D9 57 97 08 00 45 00 00 28 01 00 00 00 80 06 00 00 0A 01 62 11 0A 01 70 46 0F D6 0F A0 28 37 68 39 D1 E8 38 9D 50 12 02 00 0D 0D 00 00前14位是MAC的,后面开始到结束一共是40个字节,真是奇怪喔,我TCP的checksum是算对了,但IP的checksum总是错,函数应该是没问题的,但我算出来的结果是:0x39EB,但软件提示:0x5377才是正确的。下面是我计出来的过程: Packet[0] = 0x45;
Packet[1] = 0x00;
Packet[2] = 0x00;
Packet[3] = 0x28;
Packet[4] = 0x01;
Packet[5] = 0x00; Packet[6] = 0x00;
Packet[7] = 0x00;
Packet[8] = 0x80;
Packet[9] = 0x06;
Packet[10] = 0x00;
Packet[11] = 0x00; Packet[12] = 0x0A;
Packet[13] = 0x01;
Packet[14] = 0x62;
Packet[15] = 0x11;
Packet[16] = 0x0A;
Packet[17] = 0x01;
Packet[18] = 0x70; Packet[19] = 0x46;
Packet[20] = 0x0F;
Packet[21] = 0xD6;
Packet[22] = 0x0F;
Packet[23] = 0xA0; Packet[24] = 0x28;
Packet[25] = 0x37;
Packet[26] = 0x68;
Packet[27] = 0x39;
Packet[28] = 0xD1;
Packet[29] = 0xE8;
Packet[30] = 0x38; Packet[31] = 0x9D;
Packet[32] = 0x50;
Packet[33] = 0x12;
Packet[34] = 0x02;
Packet[35] = 0x00;
Packet[36] = 0x0D; Packet[37] = 0x0D;
Packet[38] = 0x00;
Packet[39] = 0x00; ipchecksum = checksum((USHORT *)Packet,40);
CString str; str.Format("%d",ipchecksum);
GetDlgItem(IDC_SHOWTEXT)->SetWindowText(str);
}USHORT CChecksumDlg::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);
}但结果还是:0x39EB求高手解释啊,小弟就这问题费了一个上午都没答案,跪求了。