C++ - senden von Strings über socket
Ich bin dabei ein kleines client - /server-Projekts als final-Projekt in ein C++ - Kurs. Wir übergeben einige Klassen, die kümmern sich um die Kommunikation (mit sys/socket.h), und wir können im Grunde tun connection->send(byte)
zum senden von einem byte Daten.
Sagen, dass ich eine Zeichenfolge, die ich senden möchten. Wie kann ich sicherstellen, dass ein 'a' wird interpretiert als ein 'a' beim senden von client zu server oder Umgekehrt? Da der standard ist nicht zu sagen nichts über char säumige unsigniert oder signiert, ich weiß nicht, wie es zu handhaben.
Hatte ich einige Idee, ich könnte subtrahieren std::numeric_limits<char>::min()
an jedem Ende, aber ich bin nicht sicher, es ist ein guter.
- Die 7-bit-ASCII-alphabet ist ein standard auf allen Dur-und Moll-Plattformen heute. Also, wenn Sie möchten, senden Zeichen aus dem erweiterten 8-bit-alphabet auf Ihrem OS, dann sollte es kein problem sein. Oder Kodieren Sie es in UTF-8 (das ist das gleiche wie die standard-ASCII-alphabet für die 128 ersten "Buchstaben").
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weder TCP noch UDP kümmern sich um die Codierung der Zeichenfolge. Es wird immer interpretiert werden, nur als ein array von bytes. So stellen Sie sicher, dass die Zeichenfolge richtig interpretiert wird sowohl client als auch server müssen sich auf eine gemeinsame Codierung.
In deinem Fall würde ich einfach die
c_str()
Methode von std::string für das senden der Zeichenfolge und die Zuordnung der Zeichenfolge durch die Interpretation von empfangenen Daten alsconst char*
(Für ASCII-strings). Das sollte funktionieren, solange der client-app und die server-app, sind mit den gleichen string-Bibliotheken.Um zu überprüfen, Ihre Verkehrsinfrastruktur sollten Sie einen Netzwerk-sniffer. Wireshark ist ein guter.
Wenn der sniffer erfassen Sie Ihre ethernet-Paket und sagen, dass es ein 'a', Sie können ganz sicher sein, dass Sie geschickt haben, ein 'a'.
In meiner Erfahrung, wenn Sie senden einen string mit etwas, dass ähnlich wie:
das Ergebnis ist das gleiche, wenn ich einen cast von myString.c_str() mit (char*) oder (unsigned char*).
Ein byte ist 8 bits immer 🙂
Hinsichtlich
Andere denken bewusst zu sein, ist die endiannes der CPU-Typen größer als 1 byte könnte ein problem werden. Versuchen Sie, big-endian - als standard, weil der standard für die meisten gängigen Netzwerk-Protokolle.
Beste Grüße.