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. サーバがPOSTデータを受信しないのはなぜですか?
- 2. クライアントがバイトを受信しないのはなぜですか?
- 3. 遅延ブロックはデータ受信をブロックします
- 4. ソケットrecv()はデータを受信しません
- 5. アンドロイド:なぜ意思broadcastrecieverで受信していないのですか?
- 6. なぜ私はFacebookからのメールを受信できないのですか
- 7. リモートパブリックのトランザクションキューからメッセージを受信できないのはなぜですか?
- 8. Windowsが特定のメッセージを受信しないのはなぜですか?
- 9. Rubyソケットがすべてのメッセージを受信していない
- 10. 子ウィンドウがマウスイベントを受信できないのはなぜですか?
- 11. データを受信せず、recv()が0を返す
- 12. C#で非同期でメールを送信した後、すべてのメールを受信しなかったのはなぜですか?
- 13. シンプルな方法でメインループメッセージをトリガーしてブロックするのはなぜですか?
- 14. なぜSpringはトランザクションを傍受しないのですか?
- 15. jQuery.get受信していないデータ
- 16. Firebugでは、ネットタブの「受信」値がゼロになるのはなぜですか?
- 17. recv()を使用して大きなデータを受け取る方法は?
- 18. NSStreamがデータを受信できない
- 19. PHPでヘッダを送信しないのはなぜですか?
- 20. MSG_PEEKの非ブロックrecvが成功した場合、MSG_PEEKのない次のrecvも成功しますか?
- 21. なぜ私はインストールされたアプリのブロードキャストを受信していないのですか?
- 22. fsockopenでデータを送信すると、受信側でデータが受信されない
- 23. なぜこのすべてのフォームコードを送信しても機能しないのですか?
- 24. UITextField:最初のレスポンダではないイベントを受信します
- 25. smslibはなぜSMSを送信しないのですか?
- 26. ブラウザがリファラーを送信しないのはなぜですか?
- 27. C++ UDP。 recvfrom()がブロックしていないのはなぜですか?
- 28. recv()とsend()winsock APIの問題に直面しています。最後のパケットを受信しているときにRecv()がハングします
- 29. なぜphpにデータを受け取っていないのですか?定義されていないインデックス
- 30. なぜglClearはOpenGLESでブロックされていますか?