typedef struct DLC_Header
{
unsigned char DesMAC[6]; //以太网目的地址
unsigned char SrcMAC[6]; //以太网源地址
unsigned short EtherType; //上层协议类型
} DLCHEADER;
typedef struct ipheader
{
unsigned char ip_hl:4; /*header length(报头长度)*/
unsigned char ip_v:4; /*version(版本)*/
unsigned char ip_tos; /*type os service服务类型*/
unsigned short int ip_len; /*total length (总长度)*/
unsigned short int ip_id; /*identification (标识符)*/
unsigned short int ip_off; /*fragment offset field(段移位域)*/
unsigned char ip_ttl; /*time to live (生存时间)*/
unsigned char ip_p; /*protocol(上层协议类型)*/
unsigned short int ip_sum; /*checksum(校验和)*/
unsigned char ip_src[4]; /*source address(源地址)*/
unsigned char ip_dst[4]; /*destination address(目的地址)*/
} IP;
typedef struct tcpheader
{
unsigned short int sport; /*source port (源端口号)*/
unsigned short int dport; /*destination port(目的端口号)*/
unsigned int th_seq; /*sequence number(包的序列号)*/
unsigned int th_ack; /*acknowledgement number(确认应答号)*/
unsigned char th_x:4; /*unused(未使用)*/
unsigned char th_off:4; /*data offset(数据偏移量)*/
unsigned char Flags; /*标志全*/
unsigned short int th_win; /*windows(窗口)*/
unsigned short int th_sum; /*checksum(校验和)*/
unsigned short int th_urp; /*urgent pointer(紧急指针)*/
} TCP;
typedef struct pseudoTcpHeader
{
unsigned long int ip_src;
unsigned long int ip_dst;
unsigned char zero; //always zero
unsigned char protocol; // = 0x06
unsigned short tcp_len; //TCP头+数据 (不加伪头长度)
} TCP_Psd_Header;
unsigned short int checksum(unsigned short int *buffer,int size)
{
unsigned long cksum=0;
while(size>1)
{
cksum+=*buffer++;
size-=sizeof(unsigned short int);
}
if(size)
{
cksum+=*(UCHAR *)buffer;
}
//将32位数转换成16
while (cksum>>16)
cksum=(cksum>>16)+(cksum & 0xffff);
return (unsigned short int)(~cksum);
}
void PacketCheckSum(unsigned char Packet[])
{
TCP_Psd_Header *TPH=NULL;
char *buffer=NULL;
unsigned int size=0;
DLCHEADER *DLCHeader=NULL;
IP *IPHeader=NULL;
TCP *TCPHeader=NULL;
DLCHeader=(DLCHEADER *)Packet;
IPHeader=(IP *)(Packet+sizeof(DLCHEADER));
TCPHeader=(TCP *)(Packet+sizeof(DLCHEADER)+sizeof(IP));
TCPHeader->th_sum=0;
size=ntohs(IPHeader->ip_len);
buffer=(char *)malloc(size+sizeof(TCP_Psd_Header));
if(buffer==NULL) return;
memset(buffer,NULL,size+sizeof(TCP_Psd_Header));
TPH=(TCP_Psd_Header *)buffer;
TPH->ip_dst=*(unsigned long int *)IPHeader->ip_dst;
TPH->ip_src=*(unsigned long int *)IPHeader->ip_src;
TPH->protocol=0x06;
TPH->tcp_len=htons(size-sizeof(IP));
memcpy(buffer+sizeof(TCP_Psd_Header),TCPHeader,size-sizeof(IP));
TCPHeader->th_sum=checksum(buffer,size-sizeof(IP)+sizeof(TCP_Psd_Header));
free(buffer);
return;
}