ファイル記述子を理解する方法と、あるファイル記述子からデータを読み取って処理し、別のファイル記述子に送信する方法を理解するのが困難です。
サーバーとして接続を受け入れ、データを受信し、データを処理し、それを別のクライアントに転送できる必要があります。
私は昨日epollingについて学び、クライアント - サーバーネットワークを作成するために私の戦略が正しいかどうかを知りたいです。
epollfdを作成しました。私はこれをエッジトリガー(EPOLLET)と非ブロック(使用:flags |= 0_NONBLOCK
と fctnl(epollfd, F_SETFL, flags)
。
私の意図は、networkfds(クライアントソケット)配列を作成し、接続/メッセージを受信することです。
- 新しいデータの通知を受け取る
- データの読み取り
- データ処理
- 一部のデータを他のソケットに書き込みます。
Linux Manとオンラインで見つかったすべての例は、ソケットからデータを読み取る方法に関する情報のみを提供します。私のデザインが愚かで同時に多くのクライアントと通信するようにすると、失敗するのではないかと心配です。 。
NGINX(ウェブサーバーはepollingを使っています)という文を読んでここに聞いてみることにしました。
誰でも助けることができますか?
編集1:リスト(struct epoll_event *events)に(多くの)ソケットを持ち、epoll_wait()を介してアクセスする予定です。
// If I understand correctly:
int ndfs = epoll_wait(epollfd, events, MAX_EVENTS, -1);
// Puts some events in the <events> array and an int in ndfs
nfds
events
ここで、forループを使用して繰り返すことができる利用可能なfdの数を含める必要があります。マニュアルで学んだ内容です。
そのうちの1つからメッセージを受け取ったら、それを処理し(つまり、内容を読んで決定を下し)、最終的に他のソケットへの書き込みをトリガーできるようにしたいと思います。
マルチスレッドを防ぐためにこれを行います。これは可能ですか?
ベストアンサー1
質問は「誰に手紙を書きたいですか?」です。
2つのクライアントソケットがあると仮定すると、ソケット_fd1から読み込み(またはrecv())、およびソケット_fd2で書き込み(または送信())が簡単になります。とても簡単です。
Cでは、クライアントに「応答」する必要はありません。
クライアント(または他のクライアント)に応答する必要があるかどうかは、実装したいプロトコル/アプリケーションによって異なります。
より多くのソケットが開いている場合、唯一の質問は「データはどこに行きますか」です。
すべてのクライアントソケットに同じデータを送信することもできます。 fd をテーブル/リスト/何でも保存し、各項目 "fd" に対して send(fd, buf, size, flags) を呼び出します。
(チャットサービスを作成しようとして、受信した人を除くすべての人に送るようですね:)
送信者を選択する方が複雑な場合は、各顧客に関する追加情報を含む構造化テーブルを使用して決定を下します。
これがあなたの問題を解決することを願っています。