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
.
Ich meine Schleife {async_write (200k Daten);} wird Empfänger erhält beschädigte Daten. – jean
@jean ah, Sie reden über Schreibwarteschlange. Manchmal möchte ich diese Funktion auch als Standard für Asio-Paket;) – PSIAlt
ja, wie diese: http://StackOverflow.com/a/7756894/851185. Ich glaube wirklich, dass dieses Ding von Asio selbst unterstützt werden sollte. – jean