我一直在做几天的TCP校验和。我已经查看了互联网上的许多来源,但是我没有看到任何示例向您展示如何执行TCP校验和。我也看了看RFC文件,仍然我有麻烦:C编程TCP校验和
下面是我使用生成的校验码:
unsigned short checksum(unsigned short * buffer, int bytes)
{
unsigned long sum = 0;
unsigned short answer = 0;
int i = bytes;
while(i>0)
{
sum+=*buffer;
buffer+=1;
i-=2;
}
sum = (sum >> 16) + (sum & htonl(0x0000ffff));
sum += (sum >> 16);
return ~sum;
}
此功能适用于IP校验和。
下面是我为我的TCP报头所做的结构:
struct tcp_header
{
unsigned short tcp_sprt;
unsigned short tcp_dprt;
unsigned int tcp_seq;
unsigned int tcp_ack;
unsigned char tcp_res:4;
unsigned char tcp_off:4;
unsigned char tcp_flags;
unsigned short tcp_win;
unsigned short tcp_csum;
unsigned short tcp_urp;
};
我一直在使用Wireshark来测试这些数据包,唯一错的是校验码。
最后这里是伪报头结构,我从IP报头中的TCP报头和信息加载:
struct pseudoTcpHeader
{
unsigned int ip_src;
unsigned int ip_dst;
unsigned char zero;//always zero
unsigned char protocol;// = 6;//for tcp
unsigned short tcp_len;
struct tcp_header tcph;
};
一旦我加载了这个结构用正确的信息然后我就用校验功能整个伪头结构并将TCP校验和分配给该值。你看到我提供的东西有什么不对吗?如果问题不在这里,可能是我看不到的一个粗心的错误。
如何将信息加载到结构中以及它来自哪里? – 2012-01-13 02:36:15