Datum: 14.05.2008 15:47
Hallo, Ich habe den folgenden Code geschrieben. Mein tcp checksum ist nicht korrekt, obwohl ip checksum richtig ist. Ich kann den Fehler gerade nicht finden. ich bedanke mich für euere Hilfe
#include.... #define MSG_LENGTH 1024 struct hdr{ struct iphdr ip; struct tcphdr tcp; char Data[MSG_LENGTH]; }; int main(){ struct hdr paket; struct pseudohdr Pseudo; struct sockaddr_in addr; int rawsock; const int on=1; int se; /** *create a raw socket * *transport protokol: TCP Protokol */ rawsock = create_socket(AF_INET, SOCK_RAW, IPPROTO_TCP); printf("create a Raw Socket\n"); /** *set a socket option */ if(setsockopt(rawsock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0){ perror("setsockopt()"); exit(1); } /** *initialize paket */ memset(&paket, 0, sizeof(struct hdr)); /** *create IP Header */ .... paket.ip.check = compute_checksum((uint16*)&paket.ip, sizeof(struct iphdr));///checksum /** *create TCP Header */ .... /** *create Pseudo Header for computing TCP checksum *(quelle rfc 793) */ Pseudo.saddr = paket.ip.saddr; Pseudo.daddr = paket.ip.daddr; Pseudo.reserved = 0; Pseudo.protocol = paket.ip.protocol; Pseudo.tcp_seg_len = htons(sizeof(struct tcphdr)); bcopy((char*)&paket.tcp, (char*)&Pseudo.tcp, sizeof(struct tcphdr)); printf("give your Data:\t"); fgets(paket.Data, MSG_LENGTH, stdin); bcopy((char*)&paket.Data, (char*)&Pseudo.buf, MSG_LENGTH); paket.tcp.check = compute_checksum((uint16*)&Pseudo, MSG_LENGTH + sizeof(struct tcphdr) + sizeof(struct pseudohdr)); /** *now the paket is sent */ se = sendto(rawsock, &paket, sizeof(struct hdr), 0, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)); printf("the paket is sent\n"); printf("Sent %d byte paket to %s\n",paket.ip.tot_len, DES_IP); close_socket(rawsock); return 0; } /** *hier ist checksum */ uint16 compute_checksum(uint16 *ptr, int byte){ register int sum=0; u_short odd_byte=0; /** *we add sequential 16 bit words to a 32 bit accumulator(sum) * *and at the end, fold back all the carry bit from the top 16 bits *into the lower 16 bits */ while(byte >1){ sum += *ptr++; byte -=2; } /** *mod up and add byte, if necessary */ if(byte ==1){ *((u_char*)&odd_byte) = *(u_char*)ptr; sum += odd_byte; } /** *add back carry outs from top 16 bits to low 16 bits */ sum = (sum >> 16) + (sum & 0xffff);///add hight to low sum += (sum >>16);///add carry odd_byte =~sum; return (odd_byte); } |
MFG Buns
Datum: 23.05.2008 18:59
Hi, es ist aus deinem Quelltext nicht ganz ersichtlich, aber achtest du darauf das sich der Speicherbereich des tcphdr und deiner Daten nicht überschreiben? Bzw das zu Pseudo.tcp und Pseudo.buf vorher reservierst und diese bereiche auch direkt aneinander grenzen? Ich sitze auch gerade an dem Problem. Bei mir lags daran das die Speicherbereiche nciht direkt nebeneinander waren. Dein Algorithmus sieht gut aus. MfG NoL
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel