AVR-Verwender schrieb im Beitrag #1894685:
> das hier:
>
1 | > //Empfangen und Ausgeben
|
2 | > int BytesRec = recv(conn, Buffer, sizeof(Buffer), 0);
|
3 | > Buffer[BytesRec] = 0;
|
4 | > cout << "Client:" << Buffer << endl;
|
5 | >
|
6 | > //Befehle erkennen
|
7 | > Befehl = Buffer;
|
8 | >
|
9 | >
|
> Funktioniert schonmal nicht. Dein Befehl muss nicht in einem ganzen
> Packet ankommen, theoretisch könntest du auch pro Buchstabe ein
> einzelpaket kriegen.
> (ist glaube ich default im windows-Telnet, damit jeder Tastendruck
> sofort ankommt, kann vom server aus per telnet-option verstellt werden)
>
> Du musst also recv solange aufrufen und buffern, bis du eine komplette
> Zeile empfangen hast, und dann diese überprüfen.
Und selbst wenn eine Zeile ein Paket ist, so ist die Kontrollausgabe
unglücklich gemacht, weil man nämlich genau die neuralgischen
White-Space Character wie Leerzeichen, Tab, Carriage Return, Line Feed
eben nicht sieht.
Das mindeste ist es
* sich die Stringlänge noch mit ausgeben zu lassen.
Wenn dann ein Text von "hi" keine strlen von 2 hat, dann ist noch
irgendwo ein (meistens) ein \n mit von der Partie.
* sich vor und hinter den String ein bekanntes Sonderzeichen zu setzen.
zb
cout << "Client: *" << Buffer << "*" << endl;
Die Ausgabe muss dann
lauten
steht auf dem Schirm
dann war da ein \n vor dem hi
steht dort
dann war das \n nach dem hi
steht dort
dann hat man 2 Stück \n im String, eines davor und eines dahinter
* am besten wäre es allerdings den kompletten String als ASCII Codes
auszugeben. Dann sieht man auf jeden Fall jegliche Sonderzeichen
Das ist ungeschickt. Sonderzeichen wie \n oder \r entfernt man aus dem
String ehe die Auswertung losgeht. Auch führende und nachfolgende
Leerzeichen.
Ansonsten wird dein Benutzer keine Freude haben, wenn er
hi
eingibt und der Rechner versteht ihn nicht.