Ich lerne einige Netzwerkprogrammierung und wurde empfohlen, boost-asio zu verwenden. Ich habe Daytime Tutorials 1 & 2 on: http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/tutorial.html und wollte es so ändern, dass der Server auf einen Client reagiert, der ein serialisiertes Objekt sendet, und sendet dann Ergebnisse zurück. Ich stellte mir vor, mit der Absicht so etwas wie die folgende Sequenz mit, dass der Client in der handleRead Warteschleife sitzen würde für den Server zu beenden:Daten werden nicht gesendet, bis der Socket geschlossen ist
Server:
akzeptieren -> handleRead -> process_read -> Aktion ausführen - -> handleWrite
Auftraggeber:
verbinden -> handleWrite -> handleRead -> process_read
Allerdings, wenn ich dies tun, sowohl der Server als auch der Client irgendwie in der Leseschleife stecken ich habe Konfiguration. Dies wird auf der Clientseite erwartet, aber der Client sollte die Daten schreiben und senden, bevor er zur Leseschleife gelangt. Wenn ich die Verbindung auf der Client-Seite aufbringe oder eine socket.close()
an das Ende der Schreib-Funktion schreibe, die ich geschrieben habe, finden alle weiteren Server-Schritte statt, wobei die entsprechenden Daten vom Client gesendet wurden.
Ursprünglich dachte ich, dieses Problem mit Nagle-Algorithmus in der Lage versetzt zu tun hatte, aber das Hinzufügen
boost::asio::ip::tcp::no_delay option(true);
socket.set_option(option);
Habe überhaupt nicht helfen. Fehle ich etwas, das nicht im Lernprogramm enthalten war, um zu erfahren, wie diese Daten gesendet werden, z. B. den Socket leeren?
Ich bin ziemlich neu in C + + und Netzwerk-Programmierung, so dass jede zusätzliche Dokumentation auch geschätzt wird. Vielen Dank!
Funktioniert das ursprüngliche Programm aus dem Lernprogramm? Was hast du verändert? –
Ja, tut es. Ich habe einige Dinge geändert, aber das Größte, was ich erreichen wollte, war, dass ich eine Nachricht vom Client -> Server -> Client senden konnte, anstatt nur eine Nachricht vom Server direkt nach der Verbindung zu erhalten. – ipwnatlyfe
Es ist überhaupt nicht klar von Ihrer Frage. Ich schlage vor, eine minimale Bruchänderung zu isolieren und genau das zu veröffentlichen. –