Checksumberechnung



  • Hi

    Meine Checksumberechnung stimmt nicht. Weshalb?

    struct sockaddr_in to;
        struct FORCSUM forcsum;
        struct UDPHDR udp;
        struct IPHDR ip;
        int iErr;
    
    	const int lenTotal = sizeof(ip)+sizeof(udp)+buflen;
    	char* b = new char[lenTotal]; 
    
    	to.sin_family      = AF_INET;
    	to.sin_port        = htons((u_short)destPort);
    	to.sin_addr.s_addr = inet_addr(destIP);       
    	//###########################################################################################
    	// IP header 
    
    	ip.verlen = IPversion; 
    	ip.tos	  = IPtos;      
    	ip.totallength = sizeof(ip) + sizeof(udp) + buflen;
    	ip.id = IPid;             
    	ip.offset = IPoffset;         
    	ip.ttl = IPTTL;          
    	ip.protocol = IPPROTO_UDP;
    	ip.checksum = 0;
    	ip.dstaddr = inet_addr(destIP);
    	ip.srcaddr = inet_addr(srcIP);
    
    	//############################################################################################
    	// UDP header 
    
    	udp.dstdport = htons((u_short)destPort);
    	udp.srcport = htons((u_short)srcPort);
    	udp.checksum = 0;
    	udp.len = htons(sizeof(udp) + buflen);
    
    	forcsum.srcaddr = inet_addr(srcIP);
    	forcsum.dstaddr = ip.dstaddr;
    	forcsum.padzero = 0;
    	forcsum.protocol = IPPROTO_UDP;
    	forcsum.tcplength = buflen + sizeof(udp);
    
    	//Überprüfung
    
    	if (sizeof(ip) > sizeof(forcsum)) {
    
    	//forcsum in den buffer kopieren
    
    	memcpy(b, &forcsum, sizeof(forcsum)); 
    
    	//udp hinter forcsum in den buffer kopieren
    
    	memcpy(b+sizeof(forcsum), &udp, sizeof(udp));
    
    	//daten hinter forcsum und udp in den buffer kopieren
    
    	memcpy(b+sizeof(forcsum)+sizeof(udp), buf, buflen);
    
    	//UDP Checksum berechen
    
    	udp.checksum = csum(b, sizeof(forcsum)+sizeof(udp)+buflen);
    
    	//ip in den buffer kopieren
    
    	memcpy(b, &ip, sizeof(ip));
    
    	//tcp hinter ip in den vuffer kopieren
    
    	memcpy(b+sizeof(ip), &udp, sizeof(udp));
    
    	//daten hinter ip und tcp in den buffer kopieren
    
    	memcpy(b+sizeof(ip)+sizeof(udp), buf, buflen);
    
    	//IP Checksum berechnen
    
    	ip.checksum = csum(b, sizeof(ip)+sizeof(udp)+buflen);
    
    	//senden
    
    	iErr = sendto(fd, b, lenTotal, 0,(struct sockaddr*)&to, sizeof(to));
    
    	}
    
    	delete [] b;
    
    	if(iErr == SOCKET_ERROR)
    	{
    		iErr = WSAGetLastError();
    	}
    	else
    	{
    		iErr = 0;
    	}
    
    	return iErr;
     }
    
    int csum(const void *bufv, int length)
     {
        const unsigned short *buf = (const unsigned short *)bufv;
        unsigned long result = 0;
    
        while (length > 1) {
            result += *(buf++);  
            length  -= sizeof(*buf);
        }
        if (length) result += *(unsigned char*)buf;  
        while( result >> 16) {
          result = (result >> 16) + (result & 0xFFFF);
        }
        result = (~result);
    
        return (int)result;
     }
    

    MfG Joe





  • Hmm okey, leider finde ich den Fehler selbst nicht und die angegebene Url enthält zudem keinerlei interessante, problemlösende Informationen, welche mir den Weg zu Lösung verdeutlichen würden.

    MfG Joe



  • forcsum.tcplength = htons(sizeof(udp)+buflen);

    Thx



  • //-----------------------------------------------------------
    //
    //-----------------------------------------------------------
    unsigned int CreateCksWord(unsigned char* Buffer, unsigned int Lenght)
    {
         unsigned int Index;
         unsigned long Sum = 0;
    	//Summe des Buffers bilden
    	for(Index = 0; Index <Lenght; Index+= 2)
         {
    		Sum += (((unsigned long)((Buffer[Index]<<8)&0xff00) + (unsigned long)(Buffer[Index+1]&0x00ff)));
    	}
    	//Gibt es noch ein Übertrag
    	while (Sum>>16)
    		//Übertrag zu den unteren 16 Bit addieren
            Sum = (Sum & 0xFFFF)+(Sum >> 16);
    
        return (unsigned int)~Sum;
    

Anmelden zum Antworten