2016-03-31 7 views

Antwort

0

Sie können versuchen, die Empfangs-/Sendepuffergrößen zu verwenden, die die Buchse passen empfangen/Optionen übertragen, siehe SO_SNDBUF and SO_RCVBUF on Linux sockets, getsockopt(3), SO_RCVBUF und SO_SNDBUF.

Alternativ können Sie Puffergrößen verwenden, die zu Ihren Protokollstrukturen passen und gut auf diese abgestimmt sind.

Je größer die Puffergröße in Ihrem Programm ist, desto weniger IO-Aufrufe führen Sie aus. In dem Fall, in dem Sie Nutzdaten aus mehreren nicht zusammenhängenden Speicherorten zusammenstellen, können Sie I/O-Vektoren verwenden, um IO-Syscalls zu minimieren.

+0

Ja, es ist offensichtlich, dass die Größe des Puffers sollte mit Protokollen Strukturen korrelieren. Allerdings können sich mehrere eingehende Nachrichten im System-UDP-Puffer ansammeln, bevor meine Funktion (die das Leseereignis behandelt) aufgerufen wird. Es ist also unmöglich vorherzusagen, welche Größe ausreicht. –

+0

Wie kann ich SO_SNDBUF und SO_RCVBUF in Rust bekommen? Im Fall der Verwendung von dynamisch zugewiesenen Puffern ist es notwendig, einen Heap zu verwenden, der die Leistung verschlechtert. –

+1

Mit UDP erhalten Sie nur ein Datagramm pro Lesevorgang. Wenn Sie also keine Nachrichten über mehrere Datagramme verteilt haben, sollten Sie in der Lage sein, den Puffer anhand der Nachrichtengröße zu bemessen. –

1

Sie sollten eine Größe eins größer als das größte erwartete Datagramm verwenden. Wenn Sie eine solche Größe erhalten, wissen Sie, dass ein Protokollfehler aufgetreten ist und die Daten möglicherweise abgeschnitten wurden.

Sie werden jeweils ein Datagramm empfangen. Es ist kein Stream.