
ファイル記述子を理解する方法と、あるファイル記述子からデータを読み取って処理し、別のファイル記述子に送信する方法を理解するのが困難です。
サーバーとして接続を受け入れ、データを受信し、データを処理し、それを別のクライアントに転送できる必要があります。
私は昨日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) を呼び出します。
(チャットサービスを作成しようとして、受信した人を除くすべての人に送るようですね:)
送信者を選択する方が複雑な場合は、各顧客に関する追加情報を含む構造化テーブルを使用して決定を下します。
これがあなたの問題を解決することを願っています。
答え2
以下を十分に区別できない場合があります。
ファイル記述子(fd)と
ソケット。
「networkfds」に言及しました。 NFSファイルが場合によっては特別な場合があるかのように境界によって異なると思います。ファイルではなく NFS ファイルです。
私が知る限り、ステートフルTCPプロトコルのためにソケットがfdをポーリングする必要がないので、これは重要です。 (より確実な場合は太字で表示します。)
raw UDP ソケットペアは fd ペアに似ています。接続は準備されていますが、データフローを設定する方法は? 「インターネット」プロトコルTCPの普遍性を説明します(IPは下の階層にすぎず、より静的で重要です。Wikipediaを参照してください!)。
もしそうなら、あなたのデザインは愚かですか?定義によると、少し原始的です。 TCP/IPと比較。ファイル記述子はIOストリームの単一の接触点であり、ソケットはインターネット時代の高度なプラグです。背中はconnect
ソケットでのみ機能します。
これはあなたに理解できますか?私はあなたの質問に半分を従うことができます、それほど遠くないことを願っています。教えてください。
答え3
わかった友達。私の問題について結論を下しました。状況によって異なります。
アプリケーションによって異なります。私は勉強しましたepollのみ/マルチスレッドのみ/ワーカースレッドを持つepollの一部のベンチマーク。
私の結論は、これが最も意味があるので、私のプロジェクトでepollとワーカースレッドを使用することです。epoll_wait
fd を読み書きに使用できる場合は、最速の fd チェッカー/セレクターですが、実際には機能します (データのデコード/分析および処理)。同時に(つまりスレッドを使用)