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: }