1

奇妙な質問の文言をお詫びします...これがデザインの問題です:

コンシューマーPCで実行されているクライアントアプリケーションの多くのインスタンスにサービスを提供するサーバー(LinuxではC ++、FWIWを使用)を開発しています。

私は以下が欲しい:

1)すべてのクライアントは、最初に「ゲートキーパー」サーバーアプリケーションに対して自分自身を識別します。これを、ユーザー名やパスワードなどの資格情報が渡されるログイン手順と考えてください。ゲートキーパープログラム「gserver」を呼び出します。(ゲートキーパー用)

2)各クライアントが検証されると、同じサーバーアドレスにバインドされた同じ物理サーバーボックスで実行されている異なるサーバーアプリケーションのいくつかのインスタンスの1つとの長期接続に配置されます。これらのインスタンスのいずれかを「wserver」(「動作中の」サーバーの場合)と呼びます。

したがって、クライアントに表示されるのは、「ゲートキーパー」アプリケーションが、同じボックスで実行されている複数の「動作中」サーバーの1つへのパスワード付きアクセスを許可することです。

これが「実際の」課題です。インバウンドサーバー接続には「既知の」ポート番号(たとえば、ポート80や443など)を排他的に使用するか、独自の「既知の」ポートを使用します。

wserver(n)との長期的な接続フェーズでは、クライアントがサーバー上の2番目のポートと通信する必要はありません。もちろん、これに伴う問題は、一度に1つのサーバープロセスのみが同じポートとサーバーアドレスにバインドできることです。

これは、クライアントがgserverを使用して行う接続も、長期接続の役割を果たす必要があることを意味します。これを達成するために私が見る唯一の方法は、ログイン後、gserverがプロキシのように動作し、gserverとクライアント間のトラフィックをクライアントが論理的にバインドされている特定のwserver(n)にコピーする必要があることです。

client(n)とgserverの間で最初に確立されたTCP / IP接続を、同じサーバー上の別のアプリケーションにそのまま「転送」し、その後、wserver(n)インスタンスの1つによって維持できると理想的です。長期的なつながり。

Webサーバーは、サーバーの負荷を分散するためにこのようなことを行うことを知っています。「負荷分散」。ここでの主な違いは、「バランシング」は特定のユーザーを特定のwserver(n)インスタンスに割り当てることです。しかし、負荷分散は一種のプロキシであるという印象もあります。これは避けようとしています(アーキテクチャが複雑になり、オーバーヘッドと単一障害点が追加されるため)。

これは概念と設計の質問です。ソースコードの例について心配する必要はありません。ただし、アイデアを広めるために絶対に必要な場合を除きます。アプローチを特定すれば、それをコード化できます。

ありがとう!

4

3 に答える 3

4

あなたが探しているのは、ファイル記述子の受け渡しです。UNP15.7を参照してください。この機能の有名なヘビーユーザーの1つはpostfixです。

于 2009-12-08T04:04:04.187 に答える
2

私はずっと前にそのようなアプリケーションを開発しました。複数のサーバーが同じポートでリッスンできないため。必要なのは、既知のポートでgserverをリッスンさせることです。接続が確立されたら、Unixソケットを介して他のサーバーに接続を渡します。接続が他のサーバーに渡されると、gserverは見えなくなります。それは死ぬ可能性があり、他のサーバーは引き続き接続を提供します。

于 2009-12-08T04:08:14.367 に答える
0

これがあなたのデザインに当てはまるかどうかはわかりませんが、通常の解決策(xinetdデーモンによって実装される)は、プロセスをfork()してからexec()することです。たとえば、xinetdは、実際にはさまざまなプログラムによって提供されるrlogin、rsh、tftp、telnetなどのサービスを提供する場合があります。wserverがシステムですでに実行されているプロセスである場合、これは役に立ちません。

于 2009-12-08T04:04:33.327 に答える