問題タブ [select-function]
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++ - select関数は内部的にtcpconnectを呼び出しますか?
コードシンペット:
私の質問は、非ブロックエラーのために接続が失敗し、selectが呼び出され、select return successと言うと、もう一度connectを呼び出すか、関数internal do connectを選択する必要がありますか?
c - select によるソケットプログラミング
ソケットと通信する 2 つのノードがあります。各ノードには、他のノードと通信するための読み取りスレッドと書き込みスレッドがあります。以下は、読み取りスレッドのコードです。そのコードを使用すると、2 つのノード間で通信が正常に機能します。しかし、このスレッドに選択機能を追加しようとしていますが、問題が発生しています (選択のコードはコメントにあります。コメントを外して機能を追加するだけです)。問題は、1 つのノードがメッセージを受信せず、タイムアウトのみを行うことです。他のノードは他のノードからメッセージを取得しますが、タイムアウトすることはありません。その問題はありません (両方のノードがメッセージを送受信します) 選択なし (コメント /* */ を保持)。
誰が問題が何であるかを指摘できますか? ありがとう。
c - スリープを使用して信号で選択
私のプログラムはシグナルを使用して処理を制御しているため、この関数を使用しselect()
て1秒間待機したいので、sleep()
途中で戻ります。奇妙なことに、select()
それを使用すると、時期尚早に戻ってしまいます。
私はこのようにselectと呼んでいます
しかし、信号が到着するたびに、それは戻ります(私は信号にナノ秒タイマーを使用しています)
誰もが理由を知っていますか?
c - stdinとサーバーでリッスンするためのselect()システムコールの使用
STDINとSOCKFD(サーバーに接続されている)を多重化するためにselectシステムコールを使用したいので、STDINとSOCKFDの両方をリッスンする必要があり、データを読み取ることができる場所に応じて、さらに先に進む必要があります。
注:#define STDIN 0
これは私が次のことをしたときに起こることです。
- 通常の方法でサーバーに接続します[socket()then connect()]
- STDINと接続ソケット記述子「SOCKFD」を読み取り用のfd_set(「readset」という名前)に追加します。
- 次に、select()を呼び出します。
- FD_ISSETを使用して、読み取りの準備ができているfdを判別します。
この設定の問題は、FD_ISSETが両方のfdに対して常に真であるということです。サーバーに接続すると、FD_ISSET(sockfd、&readset)が常にtrueであることがわかります。また、サーバーがデータを送信しているかどうか、またはキーボードからデータを入力しているかどうかにかかわらず、FD_ISSET(STDIN、&readset)もtrueです。
何が間違っているのでしょうか?
/*接続に成功しました*/
}
c - select() は、長い実行時間の直後にタイムアウトします (C++)
ほとんどの場合、このコードは問題なく動作します。しかし、実行可能ファイルがしばらく実行されていると、select() がすぐにタイムアウトしたように見え、その後、呼び出され続けるという奇妙な状態になり、すぐにタイムアウトを何度も繰り返すことがあります。それからそれは外側から殺されなければなりません。
私の推測では、標準入力が時間の経過とともに変化する方法に問題があると思います-それがselectがブロックしているものです。
StackOverflow を見回すと、select() に関する問題のほとんどは、毎回マクロ (FD_ZERO & FD_SET) でリセットし、適切な初期パラメーターを使用して選択することで解決されるようです。それらはここでの問題ではないと思います。
c - select と recvfrom での予期しない結果
「タイムアウト」が発生する前に他のプログラムからこのプログラムにメッセージを送信しないと、select ステートメントが「失敗」するため、その中で recvfrom ステートメントを使用できません。私はかつて、他のプログラムが無限ループでこれに連絡するようにしましたが、if ステートメントの中に入ることはありませんでした。
何が機能するか: 各タイムアウトが発生する前にこのプログラムに連絡すれば、すべて問題ありません。recvfrom ステートメントを if(___ && select) の外に置くと、完全に正常に動作します。
以下は、このプログラムが Recv と呼ばれる小さな図です。
プログラムは A と B に正常に接続します //ループの開始に戻ります
これを投稿する 2 分前に、以前のコードを最後にもう一度確認することにしました。忘れたらしい
for ループ (tv.tv_sec = 1) の後。
なぜこれを行う必要があるのか 誰かが詳しく説明できますか?
c - select() ICMP ポートに到達できない場合でも 3 秒のタイムアウト
非ブロッキングソケットでサーバーに接続しようとすると(select()をタイムアウトパラメーターで使用できるように)、iptablesによってブロックされているポートに接続すると、-j REJECTでselect()が待機することに気付きましたタイムアウトパラメータまでですが、最大3秒.. ICMPポート到達不能パケットが本当に速いかどうかは問題ではありません.
上記の例では、接続が localhost:1234 に行き、ポートが上記のようにブロックされている場合、select() は 3 秒までブロックします。
「接続が拒否されました」を取得するために、この 3 秒のタイムアウトが発生する理由を知っている人はいますか? どうすれば微調整できますか (0.02ms 後に ICMP ポートに到達できなくなったため)?
c - ネットワークのクラッシュとその結果としてのソケットの状態
ソケットが動作しているネットワークがクラッシュしたときに、ソケットの状態がどのようになるかを知りたいです。私の問題は、このネットワークの崩壊をシミュレートすると、select()
すべてのソケットを制御する関数が、理論的には設定してはならないソケットを返すことです。オペレーティング システムが書き込みと読み取りの両方でクラッシュしたソケットを設定する可能性はありますか?
c - Select (Linux) 関数が常に 0 を返す
私の場合、選択関数は常にゼロを返します。これはタイムアウトであり、これは継続的に発生しているため、プロセスの CPU 使用率も最大 98% になります。タイムアウト値を設定する代わりに NULL を設定しようとしましたが、それでもゼロを返します。select の代わりに poll 関数も使用しました。同じ問題が世論調査にもありました。
これが私のコードの一部です。
c - select() を使用して C でキーボードから入力を読み取る方法
select() を使用してキーボード入力を読み取ろうとしていますが、キーボードから読み取る方法とファイル記述子を使用して読み取る方法がわからないことに行き詰まりました。この問題に対処するために STDIN と STDIN_FILENO を使用するように言われましたが、まだ混乱しています。
どうすればいいですか?