谁有计算UDP校验和的代码发出来参考下 谢谢了

解决方案 »

  1.   

    http://topic.csdn.net/t/20050301/21/3816586.html
      

  2.   

    以下是我的源代码,   
        
      ////////////////////////////////////////////////////////////////////   
            char*   szSendBuf=Buffer;   
          
      //填充IP首部   
            ipHeader.h_lenver=iphdr->h_lenver;   
            ipHeader.tos=iphdr->tos;   
            ipHeader.total_len=iphdr->total_len;   
            ipHeader.ident=iphdr->ident;   
            ipHeader.frag_and_flags=iphdr->frag_and_flags;   
            ipHeader.ttl=iphdr->ttl;   
            ipHeader.proto=iphdr->proto;   
            ipHeader.checksum=iphdr->checksum;                                         //注意添校验和   
            ipHeader.sourceIP=inet_addr(FilSou);   
            ipHeader.destIP=inet_addr(FilDes);   
        
            //填充UDP首部   
            udpHeader.uh_sport=pUdpHeader->uh_sport;   
            udpHeader.uh_dport=pUdpHeader->uh_sport;   
            udpHeader.uh_len=pUdpHeader->uh_len;   
            udpHeader.uh_sum=/*pUdpHeader->uh_sum*/0;   
        
        
            int     iUdpChecksumSize   =   0;   
            ZeroMemory(Buffer,MAX_PACKET_SIZE);         //初始化发送缓冲区   
        
            memcpy(szSendBuf,   &ipHeader.sourceIP,   sizeof(ipHeader.sourceIP));     
            szSendBuf   +=   sizeof(ipHeader.sourceIP);   
            iUdpChecksumSize   +=   sizeof(ipHeader.sourceIP);   
        
            memcpy(szSendBuf,   &ipHeader.destIP,   sizeof(ipHeader.destIP));       
              
            szSendBuf   +=   sizeof(ipHeader.destIP);   
            iUdpChecksumSize   +=   sizeof(ipHeader.destIP);   
        
            szSendBuf++;   
            iUdpChecksumSize   +=   1;   
        
            memcpy(szSendBuf,   &ipHeader.proto,   sizeof(ipHeader.proto));     
            szSendBuf   +=   sizeof(ipHeader.proto);     
            iUdpChecksumSize   +=   sizeof(ipHeader.proto);   
        
            memcpy(szSendBuf,   &udpHeader.uh_len,   sizeof(udpHeader.uh_len));     
            szSendBuf   +=   sizeof(udpHeader.uh_len);   
            iUdpChecksumSize   +=   sizeof(udpHeader.uh_len);   
        
            memcpy(szSendBuf,   &udpHeader,   sizeof(udpHeader));     
            szSendBuf   +=   sizeof(udpHeader);   
            iUdpChecksumSize   +=   sizeof(udpHeader);   
        
            int   UdpLenth   =   udpHeader.uh_len;   
              
            
            char   temp[2000];   
        
            for   (int   m=0;   m<UdpLenth;m++,szSendBuf++)   
            temp[m]=*szSendBuf;   
        
        //       *szSendBuf   ^=1;   
        
            iUdpChecksumSize   +=UdpLenth;   
        
            unsigned   cksum   =   checksum((USHORT   *)Buffer,   iUdpChecksumSize);   
            udpHeader.uh_sum   =   cksum;   
        
            ZeroMemory(Buffer,   MAX_PACKET_SIZE);   
            szSendBuf   =   Buffer;   
        
            memcpy(szSendBuf,   &ipHeader,   sizeof(ipHeader));   
            szSendBuf   +=   sizeof(ipHeader);   
            memcpy(szSendBuf,   &udpHeader,   sizeof(udpHeader));   
            szSendBuf   +=   sizeof(udpHeader);   
            memcpy(szSendBuf,temp,   UdpLenth);   
        
            if(bind(sock,   (SOCKADDR     FAR     *)&Sender,     sizeof(Sender))!=0)       
                    {       
                                    printf(     "Can't     bind     sender     socket     to     local     port!Program     stop.\n     ");//初始化失败返回-1       
                                    return     -1;       
                    }     
        
        
            int   rect=sendto(sock,   Buffer,   RecvSize,     
                                    0,   (struct   sockaddr*)&addr_in,   sizeof(addr_in));     
        
            if   (rect==SOCKET_ERROR)     
            {     
                    printf("UDP   send   error!:%d\\                 n",WSAGetLastError());     
                    return   false;     
            }     
            else     
                    printf("UDP   send   ok!\n");     
        
      ////////////////////////////////////////////////////////////////   
        
        
        
        
        
      //CheckSum:计算校验和的子函数     
      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);     
      }