Ärger mit Escape Sequences



  • Ich versuche im Moment, einen CLient zu programmieren, der mit zwei Threads sendet und empfängt. Damit die Verbindung mit dem Server klappt, wurde bestimmt, daß jede Nachricht an den Server mit "\r" abgeschlossen sein muss (also es soll nur message\r gesendet werden).

    Mein Code sieht wie folgt aus:

    void *send_message()
    {
        while(client_running)
        {    
            int n;
    
            for(n=0; n<=MAX_CLIENT_INPUT;n++)//Eingabe Arrays leeren
            {
                eingabe[n]='\0';
                temp_eingabe[n]='\0';
            }
            fgets(temp_eingabe, MAX_CLIENT_INPUT, stdin);//Tastatureingabe holen
            strncpy(eingabe,temp_eingabe,strlen(temp_eingabe)-1);//Eingabe um letztes Zeichen verkürzen (\n)
            strcat(eingabe,"\r");//\r anhängen
    
            int char_nr = send(sock,eingabe, strlen(eingabe),0);//senden
            if(char_nr != strlen(eingabe));
            {
            printf("FEHLER beim senden\n");
            }
        }
    }
    

    Leider ist wohl im Chararray "eingabe" danach an Stelle 0 ein \0 (habe das mit strrchr() abgeprüft), was beim Ausgeben des Strings nicht auffällt, aber die Kommunikation mit dem Server klappt danach auch nicht richtig, der erste string wird akzeptiert, der zweite (korrekte) wird vom Server angemekert und wenn ich dann nur "enter" drücke nach der Fehlermeldung wird die vorherige Eingabe richtig vom Server akzeptiert und angezeigt.
    Ab da wiederholt sich das zyklisch, also Eintippen, dann fehler, dann drücke ich nur "enter" und er zeigt die Nachricht ohne Fehler dann doch an.

    Ich kann mir das Verhalten so nicht wirklich erklären, und da ich ja leider auch nicht sehe, was der Server letztenendes von mir empfängt, tappe ich im Dunkeln..

    Irgendwie kommen immer wieder wohl escape sequences dazwischen, aber ich verstehe nicht wie.

    Kann mir da jemand weiterhelfen?



  • Wenn du nur '\r' statt '\n' austauschen willst, dann mach es doch einfach:

    temp_eingabe[strlen(temp_eingabe)-1] = '\r';
    

    PS: Der Fehler bei dir liegt daran, daß strncpy() kein abschließendes Nullzeichen dranhängt, wenn der Quellstring mehr Zeichen enthält als du kopieren willst.
    Und wie sind deine beiden Arrays definiert? Ich hoffe, als [MAX_CLIENT_INPUT+1]), sonst hast du auch noch einen Speicherüberschreiber drin.



  • Dass hättest du in C++ aber eleganter lösen können.



  • du schrieb:

    Dass hättest du in C++ aber eleganter lösen können.

    na, und erst in python, java, visual basic, delphi, ... 🙄


Anmelden zum Antworten