Загрузка файла с использованием нескольких соединений и множественной адресации - PullRequest
3 голосов
/ 07 февраля 2012

Я студент четвертого курса в университете.Мой дипломный проект - менеджер загрузок, который я собираюсь кодировать с помощью C #.при проверке документации MSDN проект выглядел просто.Но проблема в том, что мой учитель хочет, чтобы я включил multihoming в проект.Он хочет, чтобы менеджер загрузок:

  1. разделял файл, который пользователь хочет загрузить, на несколько сегментов.
  2. для каждого сегмента DM должен создать соединение и запросить этот сегмент с сервера.
  3. после завершения загрузки всех сегментов DM должен объединить сегменты в один файл.
  4. Если существует множественная адресация, каждое соединение должно проходить (или маршрутизироваться) через другого провайдера (как при использовании множественной адресации,компьютер подключен к нескольким провайдерам через несколько сетевых адаптеров), поскольку этот процесс должен ускорить загрузку файла.

Я могу выполнить первые три шага, но я не смог найти решение четвертого шага, поэтому кто-то может попросить меня помочь или направить меня по правильному пути.

Яне опытный программист сетей и протоколов. Я выбрал только C #, потому что он упрощает процесс отправки и запроса файлов.

1 Ответ

4 голосов
/ 07 февраля 2012

Я полагаю, что ваш ответ лежит в свойстве ServicePoint.BindIPEndPointDelegate, которое вы можете установить в своем экземпляре HttpWebRequest. Цитата MSDN:

Некоторые методы балансировки нагрузки требуют от клиента использования определенного локальный IP-адрес и номер порта, а не IPAddress.Any (или IPAddress.IPv6Any для интернет-протокола версии 6) и кратковременный порт. Ваш BindIPEndPointDelegate может удовлетворить это требование.

По сути, BindIPEndPointDelegate позволяет вам выбрать локальную конечную точку для использования в вашем соединении. Вы можете получить список всех локальных IP-адресов, используя Dns.GetHostAddresses(Dns.GetHostName()), а затем выбрать один из них случайным образом в делегате. Однако вам необходимо соблюдать осторожность, чтобы соответствовать семейству адресов: если удаленной конечной точкой является 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();

Ссылки:

Редактировать : Я не предлагаю вам выбирать произвольные локальные адреса для вашего проекта; приведенный выше код был просто самой простой демонстрацией, которую я мог придумать. Если вы устанавливаете несколько одновременных подключений и хотите максимизировать распределение нагрузки по всем доступным адаптерам, то вам следует циклически просматривать свои локальные адреса; это гарантировало бы, что все адаптеры обрабатывают примерно одинаковое количество соединений каждое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...