2012-10-22 7 views
5

私はソケットを聴き、クライアントへの接続を待っていて、接続が確立されるとすぐに起動する別のアプリケーションに接続を渡すシステムを持っています。ソケットを別のポートにルーティングする

私はこの他のアプリケーションをコントロールしておらず、リッスンするポートのみを設定できますが、新しいクライアントごとに1つのプロセスが必要です。

これは私がやろうとしているものです:

routing

私は解決策を探してきたが、私は事、私は右の用語を持っていないが、私が見つけることができましたリチャードスティーブンスの「Unix Network Programming」のAF_ROUTEソケットファミリについては、SOCK_RAWと組み合わせて、別のIPおよびポートに接続をルーティングすることができます。しかし、how to use this flagに関するドキュメントがあまりにも少なく、(私が避けたい)スーパーユーザ権限が必要なようです。

おそらく簡単な解決策がありますが、間違った用語を使用している可能性があります。私は何をしたいのですか?

+0

はアプリとポートの1対1マッピングですか?はいの場合、なぜ彼らは自分自身を聞くことができないのですか? – SparKot

+0

@SparKot正確ではありません。新しいクライアントごとに、新しい「APP」を開く必要があります – JBernardo

+0

代わりに別のファイル記述子(stdinなど)から読み込むように他のアプリケーションに納得させることはできますか?その場合は、ソケットfdをstdinに 'dup2 'して、他のアプリケーションをfork + execすることができます。 –

答えて

0

"APP"を変更して再コンパイルできない場合は、あなたが望むようにソケットを "通過"できるとは思えません。ソケットには、所有しているプロセスにリンクされているさまざまな管理オーバーヘッド(リソース管理など)が含まれています。さらに、APPを再コンパイルできない場合、接続を受け入れることに伴う手順を迂回させる方法はなく、シンプルに既に開いているルータに接続されている「手渡し」しておく必要があります。

ただし、ルータをパススルーとして使用していると考えていますか?基本的に、あなたの "ルーター"プロセスは、ソケットを介してそれが生成する各 "APP"プロセスに接続し、適切なクライアントから適切なAPPへと受信したものをエコーし​​ます。

これはオーバーヘッドを増やし、どのクライアントがどのアプリに行くのかを追跡するために小さなマッピングを管理する必要がありますが、動作する可能性があります(APPまたはクライアントがIPアドレス彼らは、などに接続されています)。 APPを再コンパイルできないと仮定すると、あまりにも多くのオプションがないかもしれません。

このコードは比較的簡単です。 APPから受信したデータのハンドラは、マッピングから適切なアプリケーションのソケットを検索し、そのデータを非ブロック送信します。同様に、クライアントから受け取ったデータのハンドラ。クライアントとアプリケーションがどのくらい振る舞うかによって、同期を少しずつ処理する必要があります(両方を同時に受信する場合)。

+0

私は両端を通信するためにソケットで実際に読み書きしたくありませんでした。おそらく、このファイル記述子から読み取られる "APP"が実行されます。 – JBernardo

+0

hrm、多分、あなたはAPPが行うことができないことを明確にするために質問を編集する必要がありますか?私は "私はこの他のアプリケーションを制御することはできませんし、それが聞く場所だけポートを設定することができます"私はそれがソケットを読んでいたと解釈した他のオプションがないと解釈した方法を読んで。もしAPPがstdin/outや他のコマンドラインパラメータのような他の入出力オプションを持っていれば、それを使って遊ぶことができるかもしれません:) – davec

+0

私はそれをすることができるとは思わなかったが、上記のAdam Rosenfieldのコメントはオプションです。私は今それをしようとしているが、それがうまくいくかどうかわからない – JBernardo

関連する問題