問題タブ [nonblocking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ でバークレー ソケットを使用して DOS 攻撃を回避する方法
私は、Richard Stevens によるUNIX Network Programming Volume 1 に取り組んでおり、Telnet プロトコルを使用する TCP Echo クライアントを作成しようとしています。私はまだ初期段階にあり、読み書き機能を書き込もうとしています。
マルチクライアントである必要があり、Berkeley Sockets ライブラリを学習しようとしているときに C++ スレッドの学習に取り組みたくないため、I/O 多重化と Select 関数を使用するように記述したいと思います。同時に。I/O 多重化に関する章の最後に、Stevens は DOS 攻撃に関する小さなセクションを持っており、私が使用することを計画していた方法は、接続後に 1 バイトを送信するだけでハングする DOS 攻撃に対して脆弱であると述べています。その後、彼は 3 つの可能な解決策について言及しています。つまり、ノンブロッキング IO、スレッド化 (アウト)、および I/O 操作にタイムアウトを設定することです。
私の質問は、そのような攻撃を回避する他の方法はありますか? そうでない場合、これらのうちどれが最高ですか? 操作にタイムアウトを設定するセクションをざっと見ましたが、やりたいことのようには見えません。それを行うために彼が提案する方法はかなり複雑に見えます。私は NIO の章をちらりと見ただけで、今のところそれが進むべき道のように見えますが、この章をさらに数時間掘り下げる前に、これを回避する他の方法があるかどうかを確認したいと思います.
何か案は?
linux - Linux TCP/IP ソケット ストリームの非ブロッキング送信..TCP recv バッファはどうなりますか?
これは、Linux カーネル 2.6 の TCP ソケットに関するものです。
一度に 8 MB を受信する別のクライアントにノンブロッキング送信を使用して、300 MB などの大量のデータを送信しています。
8 MB を 1 回受信すると、「受信側」は受信を停止します。これは、エラー処理などの他のタスクを実行する必要があるためです。送信者は EWOULDBLOCK を受け取りますが、これは非同期通信であるため、送信側は相手側の TCP recv バッファーをいっぱいにしようとします。
私の質問は次のとおりです。「送信者」が EWOULDBLOCK を取得し、「受信者」が受信を停止しても、TCP recv バッファーにデータが残っていますか? 同じソケットがエラー処理に使用されるため、「レシーバー」は既存のソケットを再利用する前に TCP recv バッファーをクリアする必要がありますか?
c# - スレッドセーフなノンブロッキングバッファマネージャーの提案
非同期ソケットで使用する単純なバッファーマネージャークラスを作成しました。これにより、メモリの断片化から保護され、パフォーマンスが向上します。さらなる改善または他のアプローチのための提案はありますか?
python - Python で XML を解析 (ストリーミング) するためのノンブロッキング メソッド
その場で解析して対応する必要がある (つまり、部分ツリーを解析する) 必要があるソケットを介して XML ドキュメントを受信しています。私が望むのは、そうするためのノンブロッキングメソッドです。これにより、より多くのデータが入ってくるのを待っている間 (スレッド化せずに) 他のことを行うことができます。
読み取りバッファが空のときに反復処理が終了した場合、 iterparse のようなものが理想的です。
SAXもオプションになると思いますが、私のニーズには iterparse の方が簡単に思えます。何か案は?
アップデート:
スレッドの使用は問題ありませんが、回避したいと思っていたレベルの複雑さが生じます。そのためには非ブロッキング呼び出しが適していると思いましたが、XML の解析が複雑になることがわかりました。
java - Java シリアル化、ObjectInputStream.readObject()、ブロックするかどうかをチェック
serialized での読み取りObjectInputStream
を呼び出すためにを使用しています。このメソッド ブロックは避けたいので、.readObject
Objects
Inputstream.available()
InputStream.available()
利用可能なバイトがあり、read()
ブロックされないことがわかります。Object
s が利用可能でreadObject
ブロックされないかどうかを教えてくれるシリアライゼーションのための同等の方法はありますか?
sockets - 複数のソケットを使用する場合、非ブロックまたは選択によるブロックの方が優れていますか?
10 (またはそれ以上) の異なるクライアントからの接続を受け入れることができるサーバー プログラムがあるとします。クライアントはランダムにデータを送信し、サーバーが受信しますが、更新ごとに少なくとも 1 つのクライアントがデータを送信することは確実です。サーバーは、他の処理を行う必要があるため、情報の到着を待つことができません。非同期ソケットを使用する以外に、次の 2 つのオプションがあります。
すべてのソケットをノンブロッキングにします。ループ内
recv()
で各ソケットを呼び出し、WSAEWOULDBLOCK
利用可能なデータがない場合は失敗させ、たまたまデータを取得した場合はそれを保持します。ソケットはブロッキングのままにします。すべてのソケットを に追加し、
FD_SET
を呼び出しますselect()
。戻り値が 0 以外の場合 (ほとんどの場合)、すべてのソケットをループして、適切な数の読み取り可能なソケットを見つけ、読み取り可能なソケットFD_ISSET()
のみを呼び出しますrecv()
。
最初のオプションは、関数へのより多くの呼び出しを作成しrecv()
ます。FD_SET
2 番目の方法は、すべてのandFD_ISSET
ループが原因で、プログラミングの観点からはより大きな問題になります。
どの方法 (または別の方法) が優先されますか? recv()
呼び出しの面倒な価値があるノンブロッキングソケットで失敗することによるオーバーヘッドを回避していますselect()
か?
私は両方の方法を理解しており、両方を試して成功したと思いますが、一方の方法がより良いまたは最適であると見なされるかどうかはわかりません。
pipe - O_NONBLOCKパイプの問題
パイプを使用して送受信しようとしています。
send.cpp
recv.cpp
./send ./recv
openは正しいですが、send.cppが「書き込み」を実行すると、プログラムは終了し、「4」は表示されません!!!! TaとTbが正しくありません!
私のプログラムの何が問題になっていますか?!(O_NONBLOCK falgを削除すると、プログラムは正しく機能していると言わざるを得ません)
ありがとう