web-dev-qa-db-ja.com

2つのファイル記述子(クライアント)間の通信

私はこのドキュメントをフォローしています

ファイル記述子に頭を悩ませ、ある記述子からデータを読み取り、処理してから別の記述子に送信する方法に苦労しています。

サーバーとして、接続を受け入れ、データを受信し、処理してから、別のクライアントに渡すことができる必要があります。

私は昨日epollingを紹介されましたが、私の戦略がクライアントサーバーネットワークを作成するために正しいかどうか知りたいです。

1つのepollfdが作成されます。エッジトリガー(EPOLLET)および非ブロッキング(_flags |= 0_NONBLOCK_およびfctnl(epollfd, F_SETFL, flags)で設定)に指定します。

私の意図は、networkfds(クライアントソケット)の配列を作成し、接続/メッセージをリッスンすることです。

  1. 新しいデータに関する通知を受け取る
  2. データの読み取り
  3. データを処理する
  4. 別のソケットにデータを書き込みます。

Linux manとonlineで見つけたすべての例は、ソケットからデータを読み取る方法に関する情報しか提供していません。多くのクライアントが実際に同時に多くのクライアントと通信しようとすると、設計がおかしくなり、失敗するのではないかと心配しています。

NGINX(Webサーバーは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で使用可能なfdsの数が含まれているはずです。これは、forループで繰り返すことができます。それは私がマニュアルから理解していることです。

それらの1つからメッセージを受信したら、それを処理して(つまり、その内容を読み取って決定を下す)、最終的に別のソケットへの書き込みをトリガーできるようにしたいと思います。

マルチスレッドを回避するために、これらすべてを実行します。これは達成可能ですか?

3
bem22

はい、みんな。私は私の質問について結論に達しました:それは状況次第です。

アプリケーションによって異なります。私は研究しました epollのみ/マルチスレッドのみ/ワーカースレッドを使用したepollのいくつかのベンチマーク

私は、プロジェクトにワーカースレッドでepollを使用することを結論付けました。それが最も理にかなっているからです:epoll_waitは、fdが読み取り/書き込みに使用できる場合の最速のfdチェッカー/セレクターですが、実際のジョブ(データのデコード/分析および処理は、同時に(つまり、スレッドを使用して)実行する必要があります)

0
bem22

質問は「どちらに書きたいですか?」です。

2つのクライアントソケットがあるとすると、socket_fd1で読み取り(またはrecv())し、socket_fd2で書き込み(またはsend())するのは簡単です。それはそれと同じくらい簡単です。

Cでは、クライアントに「返信」する必要はありません。

クライアント(または別のクライアント)に応答する必要があるかどうかは、実装するプロトコル/アプリケーションに関連しています。

より多くのソケットが開かれると、唯一の質問は「データはどこに行くのか」です。

すべてのクライアントソケットに同じデータを送信することもできます。 fdsをテーブル/リスト/その他に保存し、エントリごとに「fd」を呼び出します。send(fd、buf、size、flags);

(あなたが一種のチャットサービスを書こうとしているように聞こえるので、あなたはあなたが受け取ったものを除いてすべてに送るでしょう:)

送信先の選択がより複雑な場合は、各クライアントに関する詳細情報を含む構造の表を使用して決定を下してください。

それがあなたの問題を解決することを願っています。

1
Nathael Pajani

次のことを十分に区別していない可能性があります。

ファイル記述子(fd)、および

ソケット

あなたは「networkfds」について言及します。 NFSファイルが特定の状況で特別になる可能性があるように、それらは境界線だと思います。これはファイルではなく、NFSファイルです。

重要なのは、ステートフルTCPプロトコルのため、fdのポーリングはソケットに必要ないものだからです。(もっと確信が持てれば、これを太字にします。)

生のUDPソケットペアはfdのペアに似ています:接続は準備ができていますが、データフローを整理する方法は? 「インターネット」プロトコルの遍在性について説明しますTCP(IPは下の層にすぎず、より静的で、重要です。ウィキペディアを参照してください!)。

それで、あなたのデザインは馬鹿ですか?定義上、はい、少し生です。 TCP/IPと比較。ファイル記述子はIOストリームの単一の連絡先であり、ソケットはインターネット時代の豪華なプラグです。ソケット専用のconnectなどがあります。

それはあなたにとって意味がありますか?私は途中であなたのQに従うことができます、私がそれほど遠くないことを願っています。伝えてください。

0
rastafile