Socket-Anwendung: char-array wird falsch übertragen



  • Hallo,
    habe mich gerade angemeldet, da ich zum ersten mal so richtig C schreibe. Ich habe eine Client-Server-Anwendung programmiert auf Basis von Sockets.
    Dabei muss ich jeweils einen buffer (char-Array) und read() und write() zum übertragen nutzen.
    Allerdings stimmt nach der Übertragung der Inhalt des char-Arrays nicht mehr. Statt 'e' kommt dann beispielsweise 'e?_?' heraus! Was läuft da schief?

    // Client
    // ...
    char buffer[1];
    buffer[0] = 'e';
    r = write(socket, buffer, 1);
    //...
    
    // Server
    //...
    char buffer[1];
    r = read(socket, buffer, 1);
    cout << buffer;
    //...
    
    // Konsole - Server
    ...
    e??_?
    Fehler: Anfrage ungültig.
    

    Verzeiht mir wenn der Beitrag etwas unübersichtlich ist, bin neu 🙂



  • char buffer[1];
    cout << buffer;
    

    In diesem Fall erwartet cout einen nullterminierten C-String. Den hast Du aber nicht, deshalb gibt cout beginnend bei buffer[0] solange Zeichen aus, bis es auf ein Nullbyte trifft.

    Teste es so:

    // Client
    // ...
    char buffer[2];
    buffer[0] = 'e';
    buffer[1] = 0;
    r = write(socket, buffer, 2);
    //...
    
    // Server
    //...
    char buffer[2];
    r = read(socket, buffer, 2);
    cout << buffer;
    //...
    


  • Also cout ist C++ und nicht C. Du bist im falschen Unterforum!

    Ansonsten:

    cout << buffer[0];
    

    Oder:

    cout.write(buffer, sizeof(buffer));
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke für deine Hilfe! Ich werde das korrigieren.
    Allerdings wird dieser eine char zur Bestimmung der serverseitigen Antwort verwendet. Dazu gibt es eine Switch-Case-Anweisung:

    // Ausschnitt Server Code
    switch(buffer[0]) {
    		case 'l': nachricht = "Sonnig, 20C.";
    		case 's': nachricht = "Regnerisch, 18C.";
    		case 'h': nachricht = "Sonnig, 17C.";
    		case 'e': nachricht = "Bevoelkt, -10C.";
    		case 'k': nachricht = "Neblig, 15C.";
    		default: nachricht = "Fehler: Anfrage ungültig.";
    }
    

    Wenn ich nun z.B. 'e' an den Server sende, tritt trotzdem default ein. Der char ist also nicht mehr 'e'.
    Läuft übrigens alles auf dem selben PC.



  • Da fehlen die breaks in den cases.



  • Scheiße, ich bin so dumm 😃
    Danke vielmals!



  • Jo, weil die breaks fehlen, bekommt Deine Nachricht nacheinander die Werte

    Bewölkt ...
    Neblig ...
    Fehler ...

    und mit dem letzten Inhalt wird dann die switch - Anweisung verlassen ...

    also:

    switch(buffer[0]) {
            case 'l': nachricht = "Sonnig, 20C.";
                      break;
            case 's': nachricht = "Regnerisch, 18C.";
                      break;
            case 'h': nachricht = "Sonnig, 17C.";
                      break;
                     // ... usw:
    }
    

Anmelden zum Antworten