2017-05-02 4 views
1

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!

+0

Funktioniert das ursprüngliche Programm aus dem Lernprogramm? Was hast du verändert? –

+0

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

+0

Es ist überhaupt nicht klar von Ihrer Frage. Ich schlage vor, eine minimale Bruchänderung zu isolieren und genau das zu veröffentlichen. –

Antwort

1

Natürlich stecken Sie in Ihrer Leseschleife fest. Es wird nicht bis zum Ende von Steam beendet, und das Ende des Streams tritt nur auf, wenn der Peer den Socket schließt.

+0

Also, wie ich das erwartet habe, ist, dass der Server in der handle_read() -Schleife sitzt, die darauf wartet, während des handle_write() -Abschnitts etwas vom Client zu erhalten, aber nichts scheint während der handle_write() geschrieben zu werden und der Client endet bis es in seiner eigenen handle_read() Schleife steckenbleibt, ohne zu senden, was es geschrieben hat, bis es bricht. Willst du sagen, ich muss etwas zwischen dem Client handle_write() und handle_read() hinzufügen, damit es die Nachricht sendet? Oder was meinst du? – ipwnatlyfe

+0

Daten * werden * gesendet, aber Ihre Leseschleife wird erst am Ende des Streams oder eines Fehlers beendet. Dies ist ein Fehler von Ihrer Seite. Sie müssen etwas mit den Daten tun, wenn sie ankommen. – EJP

+0

Die Sache ist, wenn es einfach weiter liest und 'std :: cout <<" Client (Server) Received: ";' dann macht das Sinn, aber es bleibt nur auf der size_t len ​​= boost :: asio :: lesen (Socket, boost :: asio :: buffer (inBuffer), e); Linie. Ich sehe nicht, wie es dort stecken würde nicht lesen, wenn der Kunde tatsächlich etwas geschrieben hat. Ich fügte eine Linie hinzu, um den Puffer in der Schleife auch zu drucken, aber das tut nichts, bis der Sockel entweder geschlossen wird. – ipwnatlyfe

Verwandte Themen