我一直在做幾天的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