[Winsock] Problem mit recv() loop
-
Hallo,
zuerst einmal weiß ich nicht, ob ich mit dem Thema hier richtig bin, ein passenderes Forum habe ich nicht gefuden. Also jetzt zum Thema. Es geht darum, dass ein Client eine unbekannte Anzahl von Daten zum Server schickt, daher ruft er auch mehrmal send() auf. Jetzt will ich eigentlich nur, dass der Server solange empfängt, bis die Nachicht "done!\n" kommt. Dann soll die Schleife beendet werden. Hier der Code:
// recieve until the message is "done!\n" while (strcmp(message, "done!\n") != 0) { int i = recv(mySocket, buf, size, 0); if (i == 0) { cout <<"Recv didn't work!\n"; break; } cout <<message; }
-
Tut mir Leid! Keine Ahnung warum das Thema jetzt doppelt erscheint... Dies ist der falsche Thread, kann also gelöscht werden.
-
Du hast vergessen das Problem zu erwähnen
(btw: Zusammenhang message und buf?)
-
Sry, message = buf. Das Problem ist, dass zwar alle Daten korrekt empfangen werden, aber sobald "done!\n" empfangen wird die Schleife nicht abgebrochen wird, d.h. die recv() Funktion blockt den weiteren Programmablauf. Mein Ziel ist es also Daten solange zu empfangen bis eine bestimmte message kommt.
Der korrekte Code nochmal:
// recieve until the message is "done!\n" while (strcmp(message, "done!\n") != 0) { int i = recv(mySocket, message, sizeof(message), 0); if (i == 0) { cout <<"Recv didn't work!\n"; break; } cout <<message; }
-
Du überschreibst message ja in recv() immer.
Du musst aber bedenken, dass auch erst z.B. "do" und dann im nächsten recv()-Aufruf erst das "ne\n" ankommen kann.
-
Danke - das ist bestimmt das Problem. Man könnte ja jetzt sagen, dass man einen anderen string hat, der die gesammte Datenmenge enthält und man prüft dann immer, ob der string "done!\n" enthält. Oder gibt es einen besseren Weg?
-
Auch kann es sein, das "done\n" nicht alleine kommt.
Daher ist strcmp die falsche Funktion. strstr() ist da besser geeignet.
-
Vielen Dank! Das hat sehr geholfen. Das Ganze funktioniert nun soweit, aber wenn ich um die bereits gezeigte Schleife eine weitere herumbaue funktioniert es nur beim ersten Mal, d.h. beim Schleifendurchlauf der äußeren (neu hinzugefügten) Schleife empfange ich die richtigen Daten und dannach (bei allen weiteren Schleifendurchläufen) wird nun nur noch "done" ausgepruckt und keine Daten kommen mehr an, obwohl exakt der gleiche Auftrag nochmal an den Client geschickt wird. Das send() scheint auch richtig zu funktionieren, aber das recv() nicht... (nur eine Vermutung)
-
Problem gelöst - war eigene Dummheit...
-
Glaube mir, da kommen noch ganz andere Probleme auf dich zu.
-
Störenfried schrieb:
Glaube mir, da kommen noch ganz andere Probleme auf dich zu.