Prüfsumme berechnen bei raw-Socket



  • Hallo,

    ich habe folgendes Problem. Ich versuche mit dem untenstehenden Programm die Prüfsumme für den IP-Header zu berechnen. Ich bekomme zwar eine Summe, aber wenn ich mit einem Packet-Sniffer mir ein Packet herausfiltere und bei mir die gleichen Einstellungen mache, dann bekomme ich eine andere Prüfsumme 😞

    Ich hoffe, dass mir jemand helfen kann!

    Vielen Dank!

    Gruß
    Philipp

    #include <winsock2.h>
    #include <stdio.h>
    
    typedef struct iphdr {
    	unsigned int h_len:4;				// Länge des IP-Anfangsblocks
    	unsigned int version:4;				// Version
    	unsigned char tos;					// Art des Dienstes
    	unsigned short total_len;			// Gesamtlänge
    	unsigned short ident;				// Kennung
    	unsigned short frag_and_flags;		// Fragment-Offset und Markierungen
    	unsigned char  ttl;					// TTL
    	unsigned char proto;				// Protokoll
    	unsigned short checksum;			// Header-Prüfsumme
    
    	unsigned int sourceIP;				// Quell-IP-Adresse
    	unsigned int destIP;				// Ziel-IP-Adresse
    
    }IpHeader;
    
    unsigned short checksum(unsigned short *, int);
    
    int main ()
    {
    	IpHeader		*iphdr;
    	unsigned short	        summe = 0;
    	char			buffer[100];
    
    	iphdr = (IpHeader *)buffer;
    
    		memset(iphdr,0,sizeof(struct iphdr)); // Alles auf 0 setzen
    
    	iphdr->version			= 4;
    	iphdr->h_len			= 5;
    	iphdr->tos				= 0;
    	iphdr->total_len		= htons(60);
    	iphdr->ident			= 1602;
    	iphdr->frag_and_flags	= 0;
    	iphdr->ttl				= 128;
    	iphdr->proto			= 1;
    	iphdr->checksum			= 0;
    	iphdr->sourceIP			= inet_addr("192.168.0.4");
    	iphdr->destIP			= inet_addr("192.168.0.1");
    
    	iphdr->checksum			= checksum((unsigned short*) iphdr, sizeof(struct iphdr));
    
    	printf("Checksum: %d\n", iphdr->checksum);
    
    	return 0;
    }
    
    unsigned short checksum(unsigned short *buffer, int size)
    {
    	unsigned long csum=0;
    
    	while(size > 1) 
    	{
    		csum += *buffer++;
    		size -= sizeof(unsigned short);
    	}
    
    	if(size) 
    	{
    		csum += *(unsigned short *)buffer;
    	}
    
    	csum = (csum >> 16) + (csum & 0xffff);
    	csum += (csum >>16);
    	return (unsigned short)(~csum);
    }
    

Anmelden zum Antworten