2017-05-29 7 views
0

フラグMSG_WAITALLは、recvに使用できます。これは、完全な要求が満たされるまでブロックするようにrecvを要求します。つまり、エラーが発生していないか、接続が閉じられていない限り、要求されたデータ(引数lenで指定)が受信されるまで、recvは返されません。送信にMSG_WAITALLのようなフラグがないのはなぜですか?

なぜこのようなフラグはsendにも適用されませんか?私はそれが非常に送信するために便利だと思う(send呼び出し元が送信したいすべてのバイトがTCP送信バッファに渡されるまで返されません)

+0

何を受け取るまで待つのですか? –

答えて

2

それは冗長でしょう。ソケットがまだブロッキングモードになっていない場合は、ソケットを常に入れることができます。この場合、すべてのデータが転送されるまでブロックsend()がブロックされます。

+1

そして、*によって*転送されると、カーネルの送信キュー*にキューイングされたことを意味します。 – selbie

+0

ブロッキングソケットは実際にすべてのデータを送信しますか? 'man'は、' send'は送信されたバイト量を返し、何か他のことが起こる可能性があることを意味します。さらに、この場合、RubyやPythonのような言語がソケットモジュールに追加する関数 'sendall'の目的が何であるかははっきりしません。 – Vovanrock2002

+0

@ Vovanrock2002データはバッファから別の場所に転送されます。受信側が実際にデータを放棄するのではなく、実際に受信するという保証はありません(実際にはできません)。 –

関連する問題