2016-03-31 3 views
0

Aus der Benutzeransicht ist die Eigenschaft "möglicherweise nicht alle Daten übertragen" ein Problem. Dies führt dazu, dass Handler-Aufrufe mehr als einmal ausgeführt werden (möglicherweise).asio - der Entwurfsgrund von async_write_some kann nicht alle Daten übertragen

Die freie Funktion async_write gewährleistet, dass der Handler nur einmal aufruft, aber der Aufrufer muss ihn der Reihe nach aufrufen oder die geschriebenen Daten verschachteln. Für die Verwendung der Netzwerkanwendung ist dies mehr als einmal fehlerhaft.

Wenn der Benutzer nur einmal einen Handler aufrufen möchte und die Daten korrekt geschrieben sind, muss der Benutzer etwas tun.

Ich möchte fragen ist: warum asio nicht nur machen socket :: async_write_some alle Daten übertragen?

Antwort

0

ich möchte fragen ist: warum asio nicht nur machen socket :: async_write_some alle daten übertragen?

Im Gegensatz zu async_write, socket::async_write_some ist die untergeordnete Methode.

Der OS-Netzwerkstapel ist mit Sende- und Empfangspuffern ausgestattet. Diese Puffer müssen mit einer gewissen Speichermenge begrenzt sein. Wenn Sie viele Daten über den Socket senden, kann die Empfangsseite langsamer sein als das Senden und/oder es können Probleme mit der Netzwerkgeschwindigkeit auftreten.

Dies ist der Grund, warum Buchse Puffer begrenzt und als Ergebnis Systems syscalls der Lage sein, wie Schreib sind senden oder writev sollte jetzt Anwenderprogramm, das System kann nicht akzeptieren, Teil der Daten zu informieren. Mit Buchse im Async-Modus ist es noch wichtiger. So können Socket-Syscalls nicht in asynchroner Weise arbeiten, ohne dass das Programm signalisiert, dass es anhalten soll.

Also, die async_write_some als Mid-Level-Wrapper zu writev ist erforderlich, um partielle Schreibvorgänge zu unterstützen. Auf der anderen Seite ist async_write Betrieb zusammengesetzt und kann viele Male aufrufen, um Puffer zu senden, bis der Vorgang abgeschlossen oder möglicherweise fehlgeschlagen ist. Es ruft den Beendigungshandler nur einmal auf, nicht für jeden Datenblock, der an den Netzwerkstapel übergeben wird.

Wenn Benutzer nur einen Handler nur einmal aufgerufen werden möchten und die Daten korrekt geschrieben sind, müssen Benutzer etwas tun.

Nichts besonderes, nur zu verwenden async_write, nicht socket::async_write_some.

+0

Ich meine Schleife {async_write (200k Daten);} wird Empfänger erhält beschädigte Daten. – jean

+0

@jean ah, Sie reden über Schreibwarteschlange. Manchmal möchte ich diese Funktion auch als Standard für Asio-Paket;) – PSIAlt

+0

ja, wie diese: http://StackOverflow.com/a/7756894/851185. Ich glaube wirklich, dass dieses Ding von Asio selbst unterstützt werden sollte. – jean

Verwandte Themen