C程序设计TCP校验 [英] C Programming TCP Checksum
问题描述
我一直有麻烦现在做的TCP校验了好几天。我已经看了看互联网上的许多资源,但没有的,我所看到的例子告诉你怎么做TCP校验和。我也看了看 RFC文档,仍然我有麻烦:
I have been having trouble doing the checksum for TCP for several days now. I have looked at many sources on the Internet but none of the examples that I have seen show you how to do the TCP checksum. I have also looked at the RFC document and still I am having trouble:
下面是code我使用生成校验:
Below is the code I am using to generate the checksum:
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校验和。
This function works for the IP checksum.
下面是我为我的TCP报头所做的结构:
Below is the struct I have made for my TCP header:
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来测试这些包,唯一错的是校验码。
I have been using Wireshark to test these packets and the only thing wrong is the checksum.
最后这里是伪报头结构,我加载了从IP头中的TCP报头和信息:
Finally here is the pseudo header struct that I load up with the TCP header and information from the IP header:
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校验分配给该值。你看到什么错我提供什么?如果问题不在这里可能是一个粗心的错误,我不能看到的。
Once I load up this struct with the correct information I then use the checksum function on the entire pseudo header struct and assign the TCP checksum to that value. Do you see anything wrong with what I have provided? If the problem isn't here it may be a careless error that I can't see.
推荐答案
我发现了的 WinPcap的用户邮件列表应该解决有关奇数长度的数据格雷格的评论,并给你的东西来比较你的code反对。
I found a fairly good example on the winpcap-users mailing list which should address Greg's comment about odd length data and give you something to compare your code against.
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);
}
这篇关于C程序设计TCP校验的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!