2017-05-29 3 views
0

Das Flag MSG_WAITALL kann für recv verwendet werden, das recv anfordert, zu blockieren, bis die vollständige Anforderung erfüllt ist. Das bedeutet, recv wird nicht zurückgegeben, bis so viele Daten wie angefordert (angegeben durch das Argument len) empfangen wurden, es sei denn, ein Fehler tritt auf oder die Verbindung wurde geschlossen.Warum gibt es kein Flag wie MSG_WAITALL zum Senden?

Warum gilt solch ein Flag nicht auch für send? Ich denke, dass es sehr nützlich für das Senden wäre (send kehrt nicht zurück, bis ALLE Bytes, die der Anrufer senden möchte, an den TCP-Sendepuffer übergeben wurde)

+0

Was, zu warten, bis die andere Seite es erhält? –

Antwort

2

Es wäre überflüssig. Sie können den Socket immer in den Blockiermodus versetzen, wenn dies nicht bereits der Fall ist. In diesem Fall blockiert send() solange, bis alle Daten übertragen wurden.

+1

Und mit * transfered * meinst du * in die Sendewarteschlange des Kernels * eingereiht. – selbie

+0

Schickt eine blockierende Buchse wirklich alle Daten? 'man' sagt, dass' send' die Menge gesendeter Bytes zurückgibt, was bedeutet, dass etwas anderes passieren kann. Außerdem ist in diesem Fall nicht klar, welcher Zweck die Funktion 'sendall' ist, die Sprachen wie Ruby und Python ihren Socket-Modulen hinzufügen. – Vovanrock2002

+0

@ Vovanrock2002 Die Daten werden von Ihrem Puffer an einen anderen Ort übertragen. Es gibt keine Garantie (und kann auch nicht sein), dass die empfangende Seite Ihre Daten tatsächlich "empfängt" anstatt sie wegzuwerfen. –

Verwandte Themen