Frage

Ich habe verschiedene Websites und Tutorials online gelesen, bin aber immer noch verwirrt. Wenn die Nachricht größer ist als IP MTU, dann send() Gibt das gesendete Byte zurück. Was passiert mit dem Rest der Nachricht? Soll ich anrufen send() Wieder und versuchen Sie, den Rest der Nachricht zu senden? Oder sollte das etwas IP -Schicht automatisch pflegen?

War es hilfreich?

Lösung

Wenn Sie TCP verwenden, ist die Ihnen vorgestellte Schnittstelle die eines Byt -Stroms. Sie müssen sich keine Sorgen darüber machen, wie der Strom von Bytes von einem Ende der Verbindung zum anderen kommt. Sie können die MTU der IP -Schicht ignorieren. Tatsächlich können Sie die IP -Schicht vollständig ignorieren.

Wenn du anrufst send() Der TCP -Stack auf Ihrem Computer befasst sich mit allen Details, die für den Strom von Bytes erforderlich sind, aus dem Sie in Ihre Send -Anrufe zum Aussehen kommen, aus denen Sie angezeigt werden können recv() Anrufe am anderen Ende der Verbindung.

Das einzige, an das Sie sich erinnern sollten, ist, dass Sie mit TCP mit einem Stream zu tun haben und das bedeutet, dass eine send() kann dazu führen, dass Daten in mehreren ankommen recv() Anrufe und mehrere send() Anrufe können dazu führen, dass Daten in einer einzigen ankommen recv() Anruf. Sie haben keine Kontrolle darüber. Sie haben es mit einem Strom von Bytes und jedem Anruf zu tun recv() kann eine beliebige Anzahl von Bytes von 1 auf die derzeit ausstehende Anzahl zurückgeben (so dass angemessene Puffer an die übergeben werden recv() Anruf).

Da fragten die Kommentatoren danach;)

Auf den meisten TCP -Stapeln send() Es ist höchstwahrscheinlich nicht, alles zu senden, da die Puffer des TCP -Stacks voll sind und (wahrscheinlich) das TCP -Fenster ebenfalls voll ist und der Durchflusssteuer Und es ist nicht bereit, in Ihrem Namen mehr zu puffern. Ich bin nicht auf einen TCP -Stapel gestoßen, der a ablehnen wird send() allein aufgrund von MTU -Überlegungen allein, aber ich denke, einige verschärfte eingebettete Systeme könnten sich so verhalten ...

Wie auch immer, wenn send() Gibt weniger als die Anzahl der Bytes zurück, die Sie geliefert haben, dann sollten Sie die verbleibenden Daten irgendwann wiedergeben. Häufig send() Blockiert und wartet, bis es alle Daten senden kann. Wenn Sie den Socket in den Nicht -Blockiermodus eingestellt haben Eine enge Schleife ...

Es wäre wahrscheinlich nützlich, wenn Sie das von Ihnen verwendete Betriebssystem genauer sein.

Andere Tipps

Wenn das Paket zu groß ist, um das Netzwerk zu übertragen, wird ein ICMP -Fragmentierungs -Hinweis gesendet, der dem Absender signalisiert, um die Paketgröße zu reduzieren und es erneut zu versuchen.

Wenn Sie TCP verwenden, sollten Sie alle Details erwarten, dass sich die Netzwerkschicht für Sie kümmert. Was moderne IP -Stapel hinter den Kulissen tatsächlich tun, um die niedrigste MTU auf dem Weg zu finden, scheint eine schwarze Kunst geworden zu sein.

WRT UDP Sie können immer noch erwarten, dass der Stapel für Sie fragmentiert wird, aber praktisch den Anwendungsfall für UDP ist nicht ideal. Je nach Anwendung werden Sie wahrscheinlich eine bessere Leistung erkennen, indem Sie den Pfad MTU explizit verstehen.

... Auf der Frage () befragen sich einige Stapel anders, aber die Behandlung, die Ihr Code der gleiche sein sollte. Nehmen wir an, Sie haben 100 Bytes zu senden ... send () gibt 10 Bytes gesendet. Sie müssen weiterhin mit den verbleibenden 90 Bytes gesendet werden, bis alles aus dem Kabel gedrückt wird, um die gesamte Nachricht zu senden.

Die Verwendung von Blockieren auf der Windows -Plattform send () kehrt nach dem Versenden der Windows -Plattform () nach. Auf anderen Plattformen müssen Sie weiterhin häufiger senden, um die Daten zu überschreiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top