0

N ホップ パス (S --- > M1 --- > M2 --- > M3 --- > D ) を介して TCP フローを転送するためのシーケンシャル ソケットのパイプの作成に関して質問があります。目標は、S が TCP ソケットを介してファイルを D に送信することです。したがって、すべてのノード M1、M2、および M3 は、1 つのモードのみで動作する S と D を除いて、サーバーとクライアントの 2 つのモードで動作します。

私の質問は次のとおりです。ソケットのパイプを作成してこのパスを形成し、M1 が S から最初のパケットを受信すると、それを直接 M2 などに転送します (つまり、M のいずれかが全体を受信するのを待たずに)ファイル、今まで受け取ったものをすぐに送信してください)? また、利用可能なクライアント/サーバー TCP ソケット モデルに基づいて、このタスクを実行できる場合、何が必要ですか?

4

1 に答える 1

0

はい、できます...しかし、それを行うイベントループを各マシンにプログラムする必要があります(つまり、ソケットレイヤーはそれを行いません)。

私が行う方法は、各マシンにselect()の周りでイベントループを実行させ、2つのノンブロッキングソケット(1つは受信データ用、もう1つは送信データ用)を使用することです。各プロセスには、転送するデータの一部を一時的に保存するために使用する小さな (8kB?) 内部バッファーがあります。

次に、選択ループは次のルールで動作します。

1) internal-buffer がフル未満の場合は常に、incoming-data-socket に読み取り準備が整ったときに通知を受け取りたいことを select() に伝えます。

2) internal-buffer が空である場合は常に、select() に、outgoing-data-socket に書き込み可能なバッファ スペースがある場合に通知するように指示します。

3) select() が、incoming-data-socket に読み取る準備ができているデータがあることを示すたびに、incoming-data-socket からいくつかのデータを一時的なローカル バッファーに読み取ります。(読み取る量は、incoming-data-socket で利用可能なデータ量と、ローカル バッファーで利用可能なスペース量のどちらか小さい方によって制限されます)

4) select() が、outgoing-data-socket に書き込み用のバッファー スペースがあることを示す場合はいつでも、一時的なローカル バッファーからいくつかのデータを outside-data-socket に書き込みます。(書き込む量は、incoming-data-socket に存在するデータの量と、発信ソケットが現在受け入れることができるスペースの量のいずれか小さい方によって制限されます)

上記のロジックを考えると、バイトは各ノードから次のノードへかなりパイプライン化された方法で流れます。

(エラー処理と、socket()、connect() または bind()/listen()/accept() によるソケットの設定についてはここでは説明しませんが、これも必要です)

于 2012-06-01T23:56:01.493 に答える