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