000
11.11.2008, 23:32 Uhr
~bonsda
Gast
|
ich experementiere etwas mit raw-Sockets herum und möchte ein IP-Paket via UDP verschicken. Nun ist aber scheinbar mein errechneter IP-Header murcks, ein Monitoringprogramm sagt mir das der Header 0x000 ist (also nicht gesetzt?). Nun weis ich nicht ob ih falsch rechne und die methode fehlerhaft ist oder ob ich vorher was falsch mache.
hier mal mein code:
meine structur(en)
C++: |
unsigned int headersize = sizeof(struct ip) + sizeof(struct udphdr); unsigned int payload = 512; unsigned int packetsize = headersize + payload; unsigned char packet[packetsize]; memset(packet,0,packetsize);
|
C++: |
/* Systemmitteilen das ich den Header selbst berechne */ int on=1; if (setsockopt(rs, IPPROTO_IP, IP_HDRINCL, (const char* )&on, sizeof(on)) < 0 ) { perror("IP_HDRINCL failed!\n"); exit(1); }
|
Header zusammen setzen
C++: |
/* IP Header zusammenbauen */ struct ip *iph = (struct ip*) packet; iph->ip_v = 4; //IPv4 iph->ip_hl = 5; iph->ip_tos = 0x0; iph->ip_len = sizeof(struct ip) + sizeof(struct udphdr); iph->ip_ttl = 100; iph->ip_p = IPPROTO_UDP; iph->ip_src.s_addr = inet_addr(SRC_ADR); iph->ip_dst.s_addr = inet_addr(DST_ADR); iph->ip_id = htons(random()); iph->ip_sum = ip_sum_calc(iph->ip_hl, (unsigned short*) &iph);
|
Methode zur Prüfsummenberechnung
C++: |
//typedef unsigned short u16; //typedef unsigned long u32;
u16 ip_sum_calc(u16 len_ip_header, u16 buff[]) { u16 word16; u32 sum=0; u16 i; for (i=0;i<len_ip_header;i=i+2) { word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF); sum = sum + (u32) word16; } //Nimmt von der 32-Bit Summe nur die ersten 16 Bit while (sum>>16) { sum = (sum & 0xFFFF)+(sum >> 16); } sum = ~sum; //Einerkomplement des Ergebnis return ((u16) sum); }
|
hab jetzt schon mehrere ip-header prüfsummen funktionen gegoogelt, wobei manche gleiche ergebnise liefern und andere wiederherum abweichen.
Ich hab jetzt schon vil rumprobiert, aber ich krieg eifnach nicht raus was falsch ist...
Kann mir wer helfen ? |