1

私は混乱しています:スレッドを組み合わせてfdを選択することは可能ですか/お勧めですか?例:クライアントがサーバーにメッセージを送信し、サーバーがこれを接続されているすべてのクライアントに広める(そしてクライアントが通信を継続できる)スレッド化されたtcpクライアントサーバープログラムを作成したい。

接続時にすべてのクライアントが個別のスレッドを取得するサーバークライアントプログラムを作成しました。しかし、私は beej のガイドを読みました。 CPU ホグになる。

この場合、ブロッキングが何を意味するのかわかりません。私のプログラムでは、テキストを入力してEnterキーを押すと、テキストがサーバーに送信されますが、同時にデータを受信することを意味するのはなぜですか? テキストを入力している間?そんなことがあるものか?私は混乱していると思います:p これらはプログラムに取り組むための完全に異なる方法だと思いますが、選択が提供する利点がわかりませんか? どうも

4

2 に答える 2

1

を呼び出す複数のスレッドを使用することは確かに可能ですselectが、必須ではありません。サーバーは、たった 1 つのスレッドですべてのクライアントにサービスを提供できます。どのように?一つずつ。select関数 (および 、 などのその置換poll)はepoll、指定したセットのソケットの 1 つでイベントが発生したときに通知できます。 また、 ing ソケットができるselect場合も通知します。したがって、サーバーは、リッスンしているソケットと接続されているソケットの両方を処理するイベント ループを 1 つだけ持つことができます。listenaccept

長所と短所については、The C10K problem の記事へのリンクを示します。これはかなり古い議論です。

于 2012-05-24T22:27:34.193 に答える
0

この場合、ブロッキングが何を意味するのかわかりません。私のプログラムでは、テキストを入力してEnterキーを押すと、テキストがサーバーに送信されますが、同時にデータを受信することを意味するのはなぜですか?

もちろんできます。たとえばselect()、選択したfdでそれらを他のスレッドで処理できます(そのため、この期間は、発生する可能性のある他のイベントをブロックしませんselect())。

この場合、ブロッキングが何を意味するのかわかりません。私のプログラムでは、テキストを入力してEnterキーを押すと、テキストがサーバーに送信されますが、同時にデータを受信することを意味するのはなぜですか?

彼はおそらく、データを受け入れて受信するためのスレッドが1つある場合、受け入れまたは受信時にブロック(待機)することを意味していました。ブロックとは、着信接続 (受け入れ) または着信送信データ (受信) を待っていることを意味します。イベントが発生しない場合にノンブロッキング ソケットを使用すると、 または のいずれEWOULDBLOCKかで -1 が返されますEAGAIN errno

両方を待機してselect()、リッスン fd と既に接続されているクライアント fd の両方を使用できます。次に、fd で必要なイベント (新しい接続、受信したデータなど) を同時に待機できます。

于 2013-08-16T11:17:10.390 に答える