私はソケットプログラミングについての資料をオンラインで読みました。デフォルトではwrite()
がブロックされています。いくつかの資料では、write()
は、ソケットバッファがいっぱいになったときだけブロックします。他の資料では、ユーザーバッファ内のすべてのデータがシステムバッファに移動されるまで、write()
がブロックされていると言われています。つまり、データを格納するための十分な領域がない場合はブロックされます。 write()
がブロックに設定されている場合、どのステートメントが正しいか不思議です。ノンブロッキングcの書き込み
答えて
write関数は、ディスクリプタがソケットの場合、send()関数のように動作します。 write()関数は、内部バッファがいっぱいで、すべてのデータを送信できるようになるまでブロックします。これは、ソケットがブロックされていることを前提としています。書き込み機能は信号によって中断することができます。 errnoはEINTRに設定され(戻り値はシグナルがキャッチされたときに書き込まれたバイト数になります)、すべてのデータが送信されるまでwrite()を再度呼び出すことができます。ソケットバッファがいっぱいになったとき
)は(書き込み、ブロックのみをいくつかの材料で
http://pubs.opengroup.org/onlinepubs/009695399/functions/write.htmlhttp://pubs.opengroup.org/onlinepubs/009695399/functions/send.html
私が上記に投稿したsend()関数へのリンクでは、メッセージを送信するためのスペースが送信ソケットで利用できず、ソケットファイル記述子にO_NONBLOCKが設定されていない場合、sendスペースが利用可能になるまで。だからおそらくこれがあなたが探していた答えです。私が書いたように、write()関数に渡されたすべてのデータが内部バッファに書き込まれるまでは、「すべてのデータを送信できるようになるまで」と書いていました。私は怠惰な言葉をお詫びし、あなたを誤解させることを意味しませんでした。 –
を参照してください。他のマテリアルでは、ユーザーバッファ内のすべてのデータがシステムバッファに移動されるまでwrite()がブロックされていると言います。つまり、データを配置するための十分な領域がない場合、write()もブロックします。
これは実際には何か違う言葉です。
まず、「システムバッファ」とは、「ソケットバッファ」と呼ばれるものですが、同じものです。
第2ステートメントでは、「ソケットバッファがいっぱいになったときにwrite()ブロックのみ」と書かれていると、「書き込み操作が(システム)バッファをオーバーフローさせるときにのみブロックする」と解釈する必要があります。これは、 "ユーザバッファ内のすべてのデータがシステムバッファに移動されるまで、write()がブロックされている"と同じです。条件がwrite()をブロックし、条件がfalseになるとブロックが終了すると、条件がwrite()をブロックするということだけです。これは矛盾しない。
- 1. Androidでソケットにノンブロッキング書き込み
- 2. MongoからJSON形式のレスポンスへのノンブロッキング書き込み
- 3. 想像上のロックメカニズム:ノンブロッキング書き込み、読み取り、無効化
- 4. C#の書き込み
- 5. Pythonノンブロッキングpn532タグの読み込み
- 6. 書き込みC++はXCTest
- 7. ファイル書き込みスレッドセーフC++
- 8. C#チェックボックスログファイル書き込み
- 9. ファイルへのC++の読み込みと書き込み
- 10. システムコールのC言語での読み込みと書き込み
- 11. C#でテキストファイルの読み込み/書き込みを行う
- 12. int型のC++読み込みと書き込み?
- 13. 共有メモリC++読み込みと書き込みの同期
- 14. カサンドラ書き込みタイムアウト書き込み
- 15. UNIXファイルの書き込みと書き込み以外の書き込み
- 16. 書き込みキャッシュポリシーに書き込み/フェッチを書き込む
- 17. C#でのElasticSearchクエリの書き込み
- 18. C# - context.response.outputstreamへのresponseStreamの書き込み
- 19. C++でのファイルへの書き込み
- 20. C#アプリケーションのレジストリへの書き込み
- 21. C++のデータベースへのマルチスレッド書き込み
- 22. C++ byte const *ファイルへの書き込み
- 23. ユーザードキュメントフォルダへの書き込みC++
- 24. C#ファイルへの書き込み
- 25. C#Excelファイルへの書き込み
- 26. ファイルC++での書き込み
- 27. APIなしのC++メモリ書き込み
- 28. シリアルポートへの書き込み(C++/Windows)
- 29. C書き込みuint16のは
- 30. C#読み込み/書き込み.xlsmファイル
どのソケットですか? Windows? –
@o_weismanご返信ありがとうございます。 Linuxシステム。 – HuangJie
問題のosをタグとして追加することをお勧めします。 – sjsam