Socket: "dynamischer" Puffer?
-
Hallo zusammen,
ich bastel z.Z. an einem "simplen" Socketserver und Socketclient, ähnlich wie er auf www.c-worker.ch zu finden ist (ein gutes Tutorial).
Das Problem, dass ich jetzt habe ist, dass ich mehr Daten (String) versenden und empfangen will/muss, als der Puffer groß ist.
Wie kann ich es bewerkstelligen, dass recv das Ende des gesendeten Strings erkennt?
Ich habe mir für das Empfangen eine Funktion geschrieben:
string SocketReceiveMessage(SOCKET s_source) { int int_result = 0; char chr_buffer[256]; string str_message; do { int_result = recv(s_source, chr_buffer, 256, 0); if (int_result == 0) break; // connection lost else if (int_result < 0) break; // error else { chr_buffer[int_result] = '\0'; str_message.append(chr_buffer); } } while (int_result > 0); return str_message; }
Hier muss z.B. die andere Seiter erst die Verbindung kappen, damit diese Seite merkt, "es kommt nix mehr".
-
Entweder Du sendest zuerst die Länge (4 Byte), dann den Inhalt (n Bytes) oder Du verwendest ein End of String Zeichen und liest bis das besagte Zeichen kommt.
BTW: Ich würde die empfangenen Daten zuerst in ein Buffer (z.B. std::vector) speichern und wenn dein Typ (z.B. c- string) vollständig übermittelt ist die konvertierung vornehmen.
Simon
Edit: Im folgenden Post handelt es sich exakt um daselbe Problem:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-240764-and-highlight-is-.html
-
Ok. Danke für's Erste. Das habe ich mir eigentlich auch schon fast gedacht.
Ich werde mal beides ausprobieren und dann mal gucken.
Aber erst Morgen. Jetzt geht's heim.
-
ich würde die typen nicht abkürzen und zur sicherheit alle variablen initialisieren.
int int_result = 0; char char_buffer[256] = {0}; string string_message = "";
-
ist das eronisch gemeind?