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;
}