3

私は大学4年生の学生です。私の卒業プロジェクトは、C# でコーディングする予定のダウンロード マネージャーです。MSDN のドキュメントを確認すると、プロジェクトは簡単に見えました。しかし問題は、私の先生がプロジェクトにマルチホーミングを組み込むように求めていることです。彼は、ダウンロード マネージャーに次のことを望んでいます。

  1. ユーザーがダウンロードしたいファイルを複数のセグメントに分割します。
  2. セグメントごとに、DM は接続を作成し、サーバーからそのセグメントを要求する必要があります。
  3. すべてのセグメントのダウンロードが完了すると、DM はセグメントを 1 つのファイルに結合する必要があります。
  4. マルチホーミングが存在する場合、各接続は異なる ISP を経由する必要があります (マルチホーミングが使用されている場合、コンピューターは複数のネットワーク アダプターを介して複数の ISP に接続されます)。これは、このプロセスがファイルのダウンロードを高速化するためです。

最初の 3 つのステップは達成できますが、4 番目のステップの解決策を見つけることができませんでした。

私は経験豊富なネットワーキングおよびプロトコル プログラマーではありませんが、ファイルの送信と要求のプロセスを簡素化するため、C# のみを選択しました。

4

1 に答える 1

4

あなたの答えは、インスタンスServicePoint.BindIPEndPointDelegate内で設定できるプロパティにあると思います。HttpWebRequestMSDNを引用:

一部の負荷分散技術では、クライアントが特定のローカル IP アドレスとポート番号を使用する必要があります。これは、IPAddress.Any(または IPAddress.IPv6Anyインターネット プロトコル バージョン 6 の場合) および一時的なポートではありません。この要件BindIPEndPointDelegateを満たすことができます。

基本的に、BindIPEndPointDelegate接続に使用するローカル エンドポイントを選択できます。を使用してすべてのローカル IP アドレスのリストを取得しDns.GetHostAddresses(Dns.GetHostName())、デリゲート内でランダムに 1 つを選択できます。ただし、アドレス ファミリを一致させるように注意する必要があります。リモート エンドポイントが IPv6 の場合は、ローカル IPv6 アドレスを選択する必要があります。

以下にいくつかのサンプルコードを含めます。

Uri uri = new Uri("http://google.com");

Random random = new Random();
IPAddress[] localAddresses = Dns.GetHostAddresses(Dns.GetHostName());

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.ServicePoint.BindIPEndPointDelegate =
    (servicePoint, remoteEndPoint, retryCount) =>
    {
        var allowedLocalAddresses = 
            localAddresses.Where(localAddress => 
                localAddress.AddressFamily == remoteEndPoint.AddressFamily).ToArray();

        IPAddress selectedLocalAddress = 
            allowedLocalAddresses[random.Next(allowedLocalAddresses.Length)];

        return new IPEndPoint(selectedLocalAddress, 0);
    };

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

参考文献:

編集: プロジェクトのローカル アドレスを実際に無作為に選択する必要があることを示唆しているわけではありません。上記のコードは、私が考えることができる最も単純なデモにすぎません。多数の同時接続を確立していて、利用可能なすべてのアダプタ間で負荷分散を最大化したい場合は、ローカル アドレスを循環する必要があります。これにより、すべてのアダプタがそれぞれほぼ同じ数の接続を処理することが保証されます。

于 2012-02-07T19:46:31.133 に答える