2

単一のサーバー プロセス A と複数のクライアント プロセスを作成する必要があります。データの受け渡しには、すべて Linux POSIX IPC メッセージ キューを使用する必要があります。メッセージは両方向に流れます。また、複数のクライアント プロセスがサーバー プロセス A に登録されている可能性もあります。

現在、サーバープロセスAによって作成および開かれ、クライアントプロセスによって(のみ)使用/開かれる名前付きメッセージキューを1つだけ使用しています。これは、2 つのプロセス シナリオ (つまり、1 つのサーバー プロセス A と 1 つのクライアント プロセス B) では機能しますが、複数のクライアント プロセスと 1 つのサーバー プロセスでは機能しません。

ここで直面している問題は、デザイン/ロジックにあります。サーバープロセスAでメッセージを他のクライアントプロセスから逆多重化し、サーバープロセスAから返信するにはどうすればよいですかそれぞれのクライアント プロセスでのみ処理されます。

たとえば、私は 1 つのシナリオを示しているだけです。プロセス A がメッセージ キュー X を作成したとします。プロセス B と C が起動し、メッセージ キュー X も開いています。プロセス B は要求メッセージをメッセージ キュー X に送信しますが、ここで問題はプロセス A とプロセス C の両方がエンキューで起動することです。イベント。ここで、プロセス C が Message が自分に属していないことをどのように理解するかを示します。

  • IPC メッセージのサイズは小さく、128 バイト未満です。
  • IPc メッセージは、整数とバイト配列を含む定義構造です。構造に double/float はありません。
  • IPC メッセージ キューは NON_BLOCKING モードです。
  • 高性能の義務はありません。
  • 言語: C
  • コンパイラ: GCC
  • プラットフォーム/OS: Linux
  • IPC メッセージ キュー: POSIX のみ。
  • System V メッセージや Unix ローカル ソケット、パイプなどのような他の IPC メカニズムを使用することは想定していません。

さらに詳細が必要な場合はお知らせください。

この問題の解決策を教えてください。

参考までに: 私は既にデータベースを検索しましたが、同様の質問が既に尋ねられた/回答されていないので、重複としてマークする前に確認してください。同様の問題がすでに尋ねられ、回答されている場合は、リンクを提供してください。

4

4 に答える 4

2

あなたが疑う答えではないかもしれませんが、POSIX IPC をまったく使用しないことを検討してください。私は約 15 年前に SysV IPC を使用してアプリケーションを設計しました。それは私の最悪の設計上の決定の 1 つでした。

今日では、代わりに適切なプロトコルで TCP/UDP を使用します。将来、個々のコンポーネントを別のコンピューターに移動できるという事実に加えて、IP スタックは頻繁に使用され、非常によくサポートされています。

TCP を使用すると、細かい 1:1 および個別の 1:多接続指向の通信を確立できます。UDP を使用すると、1:1、1:many、many:many の非接続指向の通信を行うことができます。セキュリティ上の問題に注意する必要がありますが、役に立つチュートリアルやサポート ライブラリがたくさんあります。

また、TCP/UDP の移植性ははるかに優れています。

于 2013-04-23T15:53:55.870 に答える
1

シナリオを正しく理解していれば、複数のメッセージ キューが必要になるようです。複数のプロセス間の双方向通信に単一のメッセージ キューを使用しようとすると、複雑な状況になります。メッセージを覗く機能がなければ、サーバー プロセスが特定のメッセージを特定のクライアントに送信することさえ困難になります。

  • クライアントが「プライベート」メッセージ キューを確立するために使用する汎用のメッセージ キューを 1 つ用意します。サーバーとの通信チャネルを開きたいクライアントは、このキューでサーバーにメッセージを送信できます。おそらく、サーバーが開くキューの名前を (たとえば、プロセス ID を使用して) クライアントに送信させます。
  • 次に、サーバーは双方向通信のためにそのクライアント専用の新しいメッセージ キューを開くことができます (または、使用法によっては、クライアントとサーバー間の各方向に 1 つずつ、2 つのキューを開くことが理にかなっている場合があります)。
于 2013-04-23T15:44:37.167 に答える
0

私は数年前にこのようなシステムを構築しましたが、すべての詳細を本当に覚えているわけではありませんが、アイデアは、キューからメッセージを読み取る方法を示す msgrcv() のパラメーターを使用することでした。

サーバーがメッセージを 1 つのクライアントにのみ送信したい場合のメッセージのタイプ (msgbuf.type) で、宛先プロセスの pid をメッセージのタイプとして使用していました。クライアントは、タイプが彼の pid と等しいメッセージのみを読み取ります。

もちろん、クライアントは初期化時に自分の pid をサーバーに送信する必要がありました。

于 2013-04-23T16:15:28.700 に答える
0

System V の msgrcv() には、キューから特定のメッセージを取得するオプションがあり、各クライアントは、サーバーによって投稿された独自のメッセージを単一のキューで読み取ることができます。したがって、単一のキューを使用して全二重通信を行うことができます。POSIX にはそのようなオプションがないため、2 つの別個のキューを使用する必要があります。1 つはサーバーがクライアントからすべてを受信するためのもので、各クライアントにはサーバーから受信するための別個のキューが必要です。qid は、すべてのプロセスでグローバルに認識されている必要があります。

于 2013-11-09T04:20:41.170 に答える