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


Anmelden zum Antworten