recv
システムコールは、すべてのデータが受信されるまでブロックされません。 recv
コールが表示されるたびに、すべてのデータがそこに入るまでrecv
を呼び出し続けるwhileループに入ります。なぜ最初にrecv
ブロックを持っていないのですか?すべてのデータを受信するまでrecvをブロックしないのはなぜですか?
8
A
答えて
9
すべてのデータが受信されるまでrecvブロックを要求できます(MSG_WAITALL
フラグ)。しかし、信号が到着した場合、何らかの作業(つまり、データの一部を受信)を行ったシステムコールは、残りを受け取るために自動的にを再起動できません。したがって、MSG_WAITALL
であっても、バッファがいっぱいになる前にrecvコールが返される場合があります。これらのケースを処理する準備が必要です。このことを考えると、多くの人々は単にループすることを選択し、MSG_WAITALL
のようなほとんど知られていないフラグを気にしません。これはデフォルトでケースである理由については
、心に来ていくつかの理由があります:
- よくあるご読み取り部分を受信したいが。たとえば、データをインクリメンタルに表示している場合や、別の場所にプロキシする場合や、データが大きすぎる場合は、一度にすべてをバッファにバッファリングすることはできません。結局のところ、すぐにファイルに書き込むだけの場合は、例えば150の代わりに200の書き込みに分割することに気をつけますか?
- 開始時に必要なデータ量がわからないことがあります。
telnet
プロトコルを検討してください。このプロトコルは、BSDソケットAPIが設計された時点で人気がありました。一度にいくつかのバイトを受け取っていますが、期待するデータ量を示す長さフィールドはなく、さらにそのデータをに表示する必要があります。ここでバッファーを埋めるまでブロックするのは意味がありません。 SMTPやIMAPなどのライン指向のプロトコルと同様に、コマンドを受け取ってからどれくらいの期間待っているかわかりません。 recv
は、提供されるバッファよりもはるかに小さくても、単一のデータグラムを受信するデータグラムソケットによく使用されます。ストリーミングソケットの自然な拡張は、待たずにできるだけ多くを返すことです。あなたが部分的にバッファとにかくに対処するために準備する必要があるため、最も重要なの
しかし、それはデフォルトでそれに対処するために人々を強制的に良いことだので、彼らは早く自分のループのバグを上げる - むしろ、信号が不幸な瞬間に到着するまで隠れたままにしておくよりも。
4
ほとんどの場合、「すべてのデータ」のデータ量はわかりません。たとえば、ライン指向のプロトコルでデータを受信している場合、行の長さは10バイトまたは65バイトです。
2
ソケットフラグをブロックまたは非ブロックのいずれかに変更できます。特定のケースは実際にブロックするかブロックしないかは関係ありません。
デフォルトで記述する方法でネットワーク機能を動作させることは意味がありません。ストリームが終了しない場合はどうすればプログラムが終了しないのでしょうか?プリマ・フェイシア、これは健康のようには見えないデフォルトの動作。
http://www.scottklement.com/rpg/socktut/nonblocking.htmlを読んで、ブロッキングIOとノンブロッキングIOについて理解してください。
関連する問題
- 1. シリアルポートでデータを連続して受信するのはなぜですか?
- 2. receive()メソッドがクライアントからデータを受信しないのはなぜですか?
- 3. Python:なぜrecv()がブロックモードでブロックしなかったのですか?
- 4. サーバがPOSTデータを受信しないのはなぜですか?
- 5. クライアントがバイトを受信しないのはなぜですか?
- 6. 正しいデータが受信されないのはなぜですか?
- 7. キューがサブスクリプション・イベントを受信しますが、プログラムは受信しないのはなぜですか?
- 8. なぜデータを受信するのが遅れますか?
- 9. Ajaxがデータを送信しないのはなぜですか?
- 10. 遅延ブロックはデータ受信をブロックします
- 11. ソケットrecv()はデータを受信しません
- 12. アンドロイド:なぜ意思broadcastrecieverで受信していないのですか?
- 13. 約束メッセージを受信するのはなぜですか?
- 14. リモートパブリックのトランザクションキューからメッセージを受信できないのはなぜですか?
- 15. なぜ私はFacebookからのメールを受信できないのですか
- 16. 投稿メソッドが送信されたデータを受信しないのはなぜですか?
- 17. クライアントがサーバーからファイルを受信しないのはなぜですか?
- 18. Windowsが特定のメッセージを受信しないのはなぜですか?
- 19. データを受信しない場合に受信ソケットが永久にブロックされないようにするにはどうすればよいですか?
- 20. C#RESTful WebApiはjsonのアラビア語でデータを受信していますが受信していますか?
- 21. Djangoはブロック内のブロックを許可しないのはなぜですか?
- 22. TCPで受信したすべてのデータが表示されない
- 23. $ http.postデータをAngularで送信しています。 PHPは空のデータを受信
- 24. Rubyソケットがすべてのメッセージを受信していない
- 25. 子ウィンドウがマウスイベントを受信できないのはなぜですか?
- 26. C#なぜタスクはいつUIスレッドをブロックしますか?すべての行を待っているのではないでしょうか?
- 27. シンプルな方法でメインループメッセージをトリガーしてブロックするのはなぜですか?
- 28. Racketのネットワークサーバが何度もデータを受信しないのはなぜですか?
- 29. データを受信せず、recv()が0を返す
- 30. C#で非同期でメールを送信した後、すべてのメールを受信しなかったのはなぜですか?