Memcpy - access violation, eigentlich sind alle parameter richtig...
-
ich habe einen 65xxx großen Buffer - darein wird ein ICMP Packet empfangen. Ich Arbeite mit Raw Sockets.
Dann will ich das Packet decodieren. Header Strukturen zu füllen klappt einwandfrei. aber wenn ich die Daten des Packets mit memcpy in einen Buffer kopieren will, dann giebt es eine Acces Violation, page fault & co.
hier mein Code:
decodeReceivedICMP(int BytesRecv){ char inc_ICMP_Data[60] = "x"; char outp_ICMP_HEADER[13]; ip_header_t *ptrInc_IP_HEADER=(ip_header_t *)inc_Buffer; //IP Header Struktur Ptr wird erzeugt icmp_header_t *ptrInc_ICMP_HEADER=(icmp_header_t *)(inc_Buffer + inc_IP_HEADER.h_len * 4); //ICMP Header Struktur Ptr wird erzeugt IP_H_Len =(unsigned short) inc_IP_HEADER.h_len * 4; // number of 32-bit words *4 = bytes if (BytesRecv < IP_H_Len + ICMP_MIN_SIZE){ printf("less than 8 bytes received... Aborting Decoding ICMP Packet."); return 1; }else{ //Ich habe beides von folgenden Möglichkeiten probiert, bei beiden memcpy's treten exceptions auf. memcpy(inc_ICMP_Data, &inc_Buffer + sizeof(icmp_header_t)+ IP_H_Len, sizeof(inc_ICMP_Data-1)); memcpy(&inc_ICMP_Data, &inc_Buffer+ 4 + 12, sizeof(inc_ICMP_Data)); //Hier tritt exception auf } printf("ICMP Packet Received...\n"); printf("ICMP Header: \n"); printf("ICMP Type: %d\n", inc_ICMP_HEADER.ucType); printf("ICMP Data: \n"); printf("%s", inc_ICMP_Data); return 0; }
liegt es vielleicht daran das ich viel mit Globalen Variablen Arbeite (In einer H Datei deklariert) ? ansonten sind die parameter von memcpy() eigentlich richtig, also es wird nicht mehr in die VAR kopiert, als drinne sein kann.
Bin am verzweifeln
Könnt ihr mir helfen ?
Gruß,
Ole
-
Dusolltest besser schreiben
sizeof(inc_ICMP_Data)-1
statt
sizeof(inc_ICMP_Data-1)
memcpy(inc_ICMP_Data...
statt
memcpy(&inc_ICMP_Data ...
-
Ok, Danke.
wenn ich die Var in eine Gleichgroße VAr kopiere, dann geht es.
Kann es sein, das sich memcpy nach den stringterminatoren richtet ? Ich habe nämlich davon ganz viele in meinem Buffer. Eigentlich sollten ja nur von ende des ICMP Headers (Anfang ICMP Data) bis ende Data kopiert werden. Das mache ich ja eigentlich auch. Vielleicht kommt memcpy mit den terminatoren in konflikt ?
-
ähm, weswegen ich eigentlich gekommen bin
typedef struct{
unsigned int h_len:4; // Länge des Headers
unsigned int version:4; // IP Version
unsigned char tos; // Type of service
unsigned short total_len; // Gesamt länge des Pakets
unsigned short ident; // unique identifier
unsigned short frag_and_flags; // flags
unsigned char ttl; // TTL
unsigned char proto; // Protokoll (TCP, UDP etc)
unsigned short checksum; // IP Checksumme
unsigned int sourceIP; // Source IP
unsigned int destIP; // Ziel IP
} ip_header_t;was bedeuten die :4 hinter den beiden ersten Struktur - Members ?
-
die Zahlen hinter dem Doppelpunkt geben die größe des Bit Feldes an, hier sollen also nur 4 Bit benutzt werden
-
Sorry, aber irgendwie komme ich da nicht weiter.
immer wenn ich memcpy(); in verbindung mit den Empfangenen Daten benutze giebt es eine Access Violation.
Ich habe auch versucht jeden einzelnen char des empfangenen Paketes der ein Nullbyte ist zu ersetzen in einer for schleife, ebenfalls Access Violation.
vielleicht mag sich jemand den ganzen code mal anschauen ?
-
ich wollt nochmal den thread pushen...
-
Wie ist inc_Buffer deklariert?
Und nein, memcpy kümmert sich nicht die Bohne um Stringterminatoren, der Inhalt ist für memcpy total egal, nur die Länge zählt