0x00 per TCP Socket senden



  • Hi,
    ich bekomme es einfach nicht hin die 0x00 per tcp zu senden.. als ob der die einfach überspringt...

    mein code

    int t1 = 0xf2;
    int t3 = 0xff;
    
    char t2[] = {0xf2, 0x00};
    //char *t2= (char) 0;
    int left = sizeof(t1);
    
    char *data1 = (char*)&t1;
    char *data3 = (char*)&t3;
    //char *data2 = (char*)&t2;
    
    char icxfull[21];
    
    strcat(icxfull, t2);
    //strcat(icxfull, data2);
    
    strcat(icxfull, icx);
    strcat(icxfull, data3);
    
    .
    .
    .
    
    .
    ..
    
    n = write(sockfd, icxfull, sizeof(icxfull));
    

    über wireshark sieht das ganze dann so aus...

    F2 30 30 34 ......

    und aussehen soll es

    F2 00 30 30 34....

    dh der schickt die 00 garnicht



  • Was bedeutet '\0' in einem C-String?
    Was macht strcat dann wohl mit 0?



  • Erstens ist das krass C hier, das hat nichts mit C++ zu tun.
    Zweitens: ließ mal die manpage zu strcat durch:

    strcat(3) schrieb:

    The strcat() function appends the src string to the dest string, overwriting the terminating null byte ('\0') at the end of dest

    Für sowas nimmt man besser memcpy oder gar memmove , weil man bei sich überlappenden Buffern keine Sorge haben braucht, dass man da was kaputtschreibt. Außerdem sind diese hoch optimiert - dieser Programmierer hier hat versucht, eine schnellere Implementierung hinzugekommen, mit AVX und SSE, und ist bisher gescheitert. 🙂

    Spricht: Der würde schon gerne die 0x00 senden, aber weil du die nicht in den Buffer tust, kann er sie auch nicht mitsenden.



  • mitch_m schrieb:

    F2 30 30 34 ......

    und aussehen soll es

    F2 00 30 30 34....

    dh der schickt die 00 garnicht

    Du schickst ja auch gar keine 0. Das haettest du mit einem Debugger in 20s rausgefunden, danke das du die Zeit von anderen verschwendest.



  • Hallo:)

    etwas her.. aber bin wieder dran...

    wie muss denn der Befehl lauten?

    memmove(icxfull, 0x00, 0); ???

    denke nicht... das funktioniert nämlich nciht:)

    bin newby... sorry hehe



  • Definiere "das funktioniert nämlich nciht".



  • mitch_m schrieb:

    Hallo:)

    etwas her.. aber bin wieder dran...

    wie muss denn der Befehl lauten?

    memmove(icxfull, 0x00, 0); ???

    denke nicht... das funktioniert nämlich nciht:)

    bin newby... sorry hehe

    http://man7.org/linux/man-pages/man3/memmove.3.html

    #include <string.h>
    
           void *memmove(void *dest, const void *src, size_t n);
    
    ---
    
           The memmove() function copies n bytes from memory area src to memory
           area dest.  The memory areas may overlap: copying takes place as
           though the bytes in src are first copied into a temporary array that
           does not overlap src or dest, and the bytes are then copied from the
           temporary array to dest.
    

    Also:
    memmove(Zieladresse, Quelladresse, Bytegröße)
    z.B.

    char dest[5];
    char src[2];
    // mit Daten befüllen ... z.B. src[0]=10; src[1]=12;
    memmove(dest, src, 2);
    


  • Oh Mann. Was für ein Code. 😞

    Erstens nutzt du String Funktionen welche das String Ende mittels einer 0 finden. Kein Wunder dass die 0 fehlt.

    Zeitens rufst du strcat() auf einem nicht initialisierten String auf. Das knallt irgentwann.

    Drittens achtest du nicht auf Speicheralignment. Unter Windows gibst hierfür die htons() Funktion.

    Viertens verschickst du sizeof(icxfull) Bytes. Also vermutlich exakt 24 Bytes. Das ist erstens fehlerhaft weil deine Daten nicht so lang sind und weil zweitens du padding Bytes missachtest.

    BITTE NIMM EINEN DEBUGGER und schau dir genau was was du da hingerotzt hast!!!



  • char t2[1] = {0x00};
    char *data2;
    memmove (data2,t2,1); 
    strcat(icxfull, data2);
    

    so in etwa?

    JA!!! der Code ist etwas durcheinander... aber bis dato versuche ich nichts anderes außer diese paar byts zu senden....



  • mitch_m schrieb:

    JA!!! der Code ist etwas durcheinander... aber bis dato versuche ich nichts anderes außer diese paar byts zu senden....

    Dann versuch doch bitte zu verstehen. Du hast wieder genau das falsch gemacht was dir schon erklärt wurde.

    char t2[1] = {0x00}; //Array der Größe eins, enthält nur ein Nullbyte
    char *data2; //Pointer der noch kein Ziel hat, zeigt auf eine undefineirte Adresse
    memmove (data2,t2,1); //Schiebt das eine Byte das t2 enthält an die Adresse auf die data2 zeigt, also irgendwo ins Nirgendwo 
    strcat(icxfull, data2);//Behält den Inhalt von icxfull(undefiniert) bis zum ersten Nullbyte bei, hängt dann alle Zeichen von data2 an bis es ein Nullybte findet.
    

    Merkst du jetzt wo das Problem ist?
    Du verwendest uninitialisierte, zufällige Variablen und verwendest eine Funktion zum Kopieren die alles kopieren kann außer Nullbytes.



  • Habe es nun hinbekommen

    char icxfull[19] = {"00004000F202F20180"};
    
    icxfull[0] = 0xF2;
    icxfull[1] = 0x00;
    icxfull[18] = 0xFF;
    

    wieso mache ich mir es so kompliziert?!:)



  • Wie wärs mit

    char icxfull[] = "\xF2\x00""004000F202F20180\xFF";
    


  • Oder gar

    char Packet[] = { 0xf2, 0x00, ..., 0xff };
    

Log in to reply