Kann boost::asio nur empfangen full-UDP-Datagramme?
Arbeite ich an einem UDP-server gebaut mit boost::asio und ich begann von tutorial anpassen an meine Bedürfnisse. Wenn ich Anrufe socket.receive_from(boost::asio::buffer(buf), remote, 0, error);
es füllt mein Puffer mit Daten aus dem Paket, aber wenn mein Verständnis richtig ist, es löscht alle Daten, die passt nicht in den Puffer. Nachfolgende Aufrufe receive_from erhalten die nächsten datagram verfügbar sind, so sieht es für mich so, es gibt einige Verlust von Daten sogar ohne Vorherige Ankündigung. Bin ich Verständnis dies der falsche Weg?
Habe ich versucht zu Lesen und immer die boost::asio-Dokumentation, aber ich schaffte es nicht, Hinweise zu finden, wie ich bin, dies zu tun der richtige Weg. Was ich tun möchte, ist das Lesen einer bestimmten Menge von Daten, so dass ich es verarbeiten; wenn das Lesen einer gesamten Datagramm ist der einzige Weg, ich kann das schaffen, aber wie kann ich sicher sein, dass Sie nicht verlieren die Daten, die ich erhalte? Welche Puffergröße sollte ich verwenden, um sicher zu sein? Gibt es eine Möglichkeit zu sagen, dass mein Puffer ist zu klein und ich bin Informationen zu verlieren?
Ich davon ausgehen, dass ich möglicherweise erhielt große Datagramme durch das design.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht spezifisch zu steigern; es ist nur, wie Datagramm-sockets arbeiten. Sie geben die buffer size, und wenn das Paket passt nicht in den Puffer, dann wird es abgeschnitten und es gibt keine Möglichkeit zur Wiederherstellung der verlorenen Informationen.
Beispielsweise das SNMP-Protokoll legt fest, dass:
Kurz gesagt: Sie haben zu berücksichtigen, wenn die Gestaltung Ihrer Kommunikation-Protokoll, Datagramme können verloren gehen, oder Sie werden möglicherweise abgeschnitten, über eine angegebene Größe.
Für IPv4-Datagramm-Größe-Feld im UDP-header 16 bit, mit einer maximalen Größe von 65.535 Byte; beim subtrahieren von 8 Byte für den header, die Sie am Ende mit einem maximum von 65,527 bytes of data. (Beachten Sie, dass dies würde erfordern, die Fragmentierung des umgebenden IPv4-Datagramm unabhängig von der zugrunde liegenden interface-MTU aufgrund der 16-bit-IPv4-Paket/fragment length-Feld).
Ich nur mit einem 64 KiB Puffer, weil es eine schöne Runde Zahl.
Werden Sie wollen im Auge zu behalten, dass auf der sende-Seite müssen Sie explizit aktivieren Fragmentierung, wenn Sie möchten, senden Datagramme größer als in der interface-MTU. Von meinem Ubuntu 12.04 UDP(7) - manpage:
Verwenden
getsockopt
mit der SO_NREAD option.Aus der Mac-OS-X-manpage: