Checksumberechnung
-
Hi
Meine Checksumberechnung stimmt nicht. Weshalb?
struct sockaddr_in to; struct FORCSUM forcsum; struct UDPHDR udp; struct IPHDR ip; int iErr; const int lenTotal = sizeof(ip)+sizeof(udp)+buflen; char* b = new char[lenTotal]; to.sin_family = AF_INET; to.sin_port = htons((u_short)destPort); to.sin_addr.s_addr = inet_addr(destIP); //########################################################################################### // IP header ip.verlen = IPversion; ip.tos = IPtos; ip.totallength = sizeof(ip) + sizeof(udp) + buflen; ip.id = IPid; ip.offset = IPoffset; ip.ttl = IPTTL; ip.protocol = IPPROTO_UDP; ip.checksum = 0; ip.dstaddr = inet_addr(destIP); ip.srcaddr = inet_addr(srcIP); //############################################################################################ // UDP header udp.dstdport = htons((u_short)destPort); udp.srcport = htons((u_short)srcPort); udp.checksum = 0; udp.len = htons(sizeof(udp) + buflen); forcsum.srcaddr = inet_addr(srcIP); forcsum.dstaddr = ip.dstaddr; forcsum.padzero = 0; forcsum.protocol = IPPROTO_UDP; forcsum.tcplength = buflen + sizeof(udp); //Überprüfung if (sizeof(ip) > sizeof(forcsum)) { //forcsum in den buffer kopieren memcpy(b, &forcsum, sizeof(forcsum)); //udp hinter forcsum in den buffer kopieren memcpy(b+sizeof(forcsum), &udp, sizeof(udp)); //daten hinter forcsum und udp in den buffer kopieren memcpy(b+sizeof(forcsum)+sizeof(udp), buf, buflen); //UDP Checksum berechen udp.checksum = csum(b, sizeof(forcsum)+sizeof(udp)+buflen); //ip in den buffer kopieren memcpy(b, &ip, sizeof(ip)); //tcp hinter ip in den vuffer kopieren memcpy(b+sizeof(ip), &udp, sizeof(udp)); //daten hinter ip und tcp in den buffer kopieren memcpy(b+sizeof(ip)+sizeof(udp), buf, buflen); //IP Checksum berechnen ip.checksum = csum(b, sizeof(ip)+sizeof(udp)+buflen); //senden iErr = sendto(fd, b, lenTotal, 0,(struct sockaddr*)&to, sizeof(to)); } delete [] b; if(iErr == SOCKET_ERROR) { iErr = WSAGetLastError(); } else { iErr = 0; } return iErr; } int csum(const void *bufv, int length) { const unsigned short *buf = (const unsigned short *)bufv; unsigned long result = 0; while (length > 1) { result += *(buf++); length -= sizeof(*buf); } if (length) result += *(unsigned char*)buf; while( result >> 16) { result = (result >> 16) + (result & 0xFFFF); } result = (~result); return (int)result; }
MfG Joe
-
Weil da ein Fehler drin ist.
-
Hmm okey, leider finde ich den Fehler selbst nicht und die angegebene Url enthält zudem keinerlei interessante, problemlösende Informationen, welche mir den Weg zu Lösung verdeutlichen würden.
MfG Joe
-
forcsum.tcplength = htons(sizeof(udp)+buflen);
Thx
-
//----------------------------------------------------------- // //----------------------------------------------------------- unsigned int CreateCksWord(unsigned char* Buffer, unsigned int Lenght) { unsigned int Index; unsigned long Sum = 0; //Summe des Buffers bilden for(Index = 0; Index <Lenght; Index+= 2) { Sum += (((unsigned long)((Buffer[Index]<<8)&0xff00) + (unsigned long)(Buffer[Index+1]&0x00ff))); } //Gibt es noch ein Übertrag while (Sum>>16) //Übertrag zu den unteren 16 Bit addieren Sum = (Sum & 0xFFFF)+(Sum >> 16); return (unsigned int)~Sum;