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