2

2つのソケットを結合することは可能ですか?

たとえば、あるプロセスが他の2つのプロセス間のメッセージのルーターとして機能している場合、ある時点で回避できると、大量のソケットIOを節約できます。これは可能であるはずのようですが、私はそれが行われていることを聞いたことがありません!

可能であれば、LinuxとWindowsで可能ですか?もしそうなら、これを設定するためにさまざまなメカニズムが使用されていますか?

ところで:私はちょうどこれを見つけました:

Linux splice()システム呼び出し。

これは私が求めているものに近いようです(もちろん、これはソケットFDでも機能すると仮定します)が、Windowsに相当するものはありますか?

4

3 に答える 3

2

私の知る限り、それは不可能です。

簡単な例: プロセスが 3 台の異なるマシンで実行されている場合、TCP/UDP などのレベルでのトラフィックのリダイレクトを伴わずにプロキシ マシンを脇に置くにはどうすればよいでしょうか?

splice は解決策ではありません。不要なメモリ コピーを回避して I/O 転送を最適化するだけですが、いずれにせよ、入力を循環させて splice を呼び出してデータを出力に「転送」するプロセスが必要です (ソケットが実際のネットワークの場合)。ソケットの場合、データはネットワーク カードを 2 回通過する必要があります)。

LLP アンドレア

于 2009-02-02T15:44:00.563 に答える
1

短い答えはいいえです。

少し長い答えはNot Generalです。splice()システム コールは Linux 固有のものであり、ソケットに対しては定義されていません。これソケット用に定義すると、メモリー・マップ・ファイルをストリーム・ソケットとの間で接続する方法になります。双方向ではないでしょう。神々は、この領域で Windows に何が存在するかを知っているだけです。

過度にこっけいな答えは、まあ、OS カーネルを拡張できますが、...それはあなたが望むものではないかもしれません。2 つのリモート アドレスPF_INETまたはPF_INET6ソケットのどちらもノード ローカルでない場合、ルーターは 2 つのリモート ホスト間でパケットを転送し続けます。各リモート ホストには、ルーター ホストを参照するソケット 5 タプルがあります。いいえ、その問題を回避するための ARP/ND6 スプーフィングの闇の芸術については説明しません。

于 2009-05-26T22:35:22.343 に答える
1

私は過去にこのようなプログラムを作成しました。あなたが 3 つのプロセスすべてのプログラマーであると仮定すると、可能ですが注意が必要です。ソケット接続 A とソケット接続 B がある場合、A から情報を取得して B に送信し、B から A に接続要求を送信します。これには少しコーディングが必要ですが、動作するはずです。それは私のためにしました。それがうまくいくことを願っています!幸運を!

于 2012-11-25T19:52:57.077 に答える