Как я могу регулировать пропускную способность на уровне домена приложения в Windows (в пользовательском режиме)?

Я хотел бы сделать следующее:

  • Мое приложение работает на компьютере с Windows (назовите его приложением A).
  • Я могу изменить исходный код приложения A, чтобы ввести регулирование пропускной способности.
  • Я хотел бы иметь возможность повторно использовать мой код регулирования пропускной способности и перенести его в любые другие приложения, которые у меня есть (другими словами, я хотел бы попытаться регулировать пропускную способность на уровне домена приложения, чтобы не пришлось повторно учитывать фактор существующие приложения для регулирования пропускной способности).
  • Я хочу регулировать суммарную скорость загрузки и загрузки А отдельно. Например, если для загрузки A выделено максимум 5 Кбит / с, то все потоки загрузки A будут ограничены совокупной суммой 5 Кбит / с.

Мои требования:

  • Я не могу использовать драйвер режима ядра.
  • Мне нужно добавить регулирование на уровне домена приложения.

Я попытался исследовать это, особенно на Stack Overflow, но не смог найти ничего полезного для моего случая:

  • я видел этот пример использования оболочки класса ThrottledStream вокруг объекта Stream, который будет вводить регулирование при использовании, но мне нужно, чтобы это было на уровне домена; Подобный подход проблематичен, потому что он потребует от меня рефакторинга большого количества существующего кода в других приложениях.
  • я видел этот вопрос кто отвечает, говорит об использовании Windows Filtering Platform API. К сожалению, у меня есть требование, что я абсолютно не могу использовать драйвер режима ядра для этого, и я понимаю, что WFP API требует его.

Кто-нибудь знает способ реализации моих конкретных требований регулирования пропускной способности для регулирования приложений на уровне домена приложения?

6

Решение

Я думаю, что нашел решение. С QOS API, вам нужно получить дескриптор вашего целевого интерфейса, используя TcOpenInterface (вы можете выяснить, на какой интерфейс вы хотите настроить таргетинг, TcEnumerateInterfaces). С вашим дескриптором интерфейса, вам нужно позвонить TcAddFlow вместе с указателем на TC_GEN_FLOW структура, которая позволяет указать как SendingFlowspec (FLOWSPEC структура) и ReceivingFlowspec (FLOWSPEC структура), которая содержит PeakBandwidth член. Затем, чтобы ваш интерфейс использовал этот поток, который вы только что добавили в него, вам нужно добавить фильтр в интерфейс, используя вызов TcAddFilter, как говорится в MSDN функция TcAddFilter связывает новый фильтр с существующим потоком, который позволяет направлять пакеты, соответствующие фильтру, в связанный поток. Я думаю, что, чтобы сделать это конкретное приложение, позвонив TcRegisterClient может сделать трюк, который вам нужно будет в любом случае вызвать для того, чтобы получить дескриптор клиента для использования с TcEnumerateInterfaces и TcAddFlow из его внешнего вида (но это еще предстоит проверить). я нашел этот полезный пример а также (еще не проверял).

Взято из MSDN, PeakBandwidth участник верхний предел разрешения передачи на основе времени для данного потока, в байтах в секунду. Элемент PeakBandwidth ограничивает потоки, которые могли накопить значительное количество кредитов передачи или маркеров из-за перегрузки ресурсов сети одноразовыми или циклическими пакетами данных, путем применения предельного уровня передачи данных в секунду. Некоторые промежуточные системы могут использовать эту информацию, что приводит к более эффективному распределению ресурсов.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector