Формирование полосы пропускания в моем приложении С#

У меня есть приложение С#, которое использует собственную библиотеку, которая отправляет видео на другой IP через Интернет с помощью UDP. У меня нет контроля трафика над этой библиотекой.

Мое приложение также вызывает веб-службы другого сервера, используя WebRequest, что у меня есть контроль над ними.

Проблема заключается в следующем:

Когда у меня низкая пропускная способность Интернета, видеопоток использует всю мою пропускную способность. Таким образом, я не получаю ответы от моих методов веб-сервисов за это время.

Есть ли способ определить приоритет WebRequest или сохранить некоторую полосу пропускания для них, чтобы я мог безопасно получать ответы?

Ответы

Ответ 1

Я не знаю какого-либо метода на С#, который может определить приоритет трафика таким образом.

Я знаю, что это не совсем ответный поток, но именно так я обрабатывал потоковые службы, не убивая полосу пропускания в моей среде, когда у вас нет надлежащего доступа к сетевой инфраструктуре, что является "правильным" способом этого.

Когда вы заключаете, какой метод вы собираетесь использовать, я рекомендую вам взглянуть на https://superuser.com, который должен иметь возможность ответить на любые камни преткновения, которые у вас будут в реализации решения.

Решение 1.

Разделить на 2 службы и обмениваться данными через REST API в каждой службе или в опросе базы данных. Затем используйте программу ограничения сети, чтобы приоритезировать трафик одной из служб. https://www.netlimiter.com/ и https://netbalancer.com/ являются примерами программного обеспечения, которое может сделать это, но их еще много.

Преимущество: у вас будет динамическое дросселирование вашей потоковой службы.

Недостатки: вам потребуется другая программа, работающая на сервере, и ее определенно не бесплатно.

Решение 2.

Используйте IIS, Theres встроенный дроссель в IIS https://www.iis.net/configreference/system.applicationhost/weblimits и посмотрите на maxGlobalBandWidth. Затем у вас есть 2 веб-сайта, которые общаются через REST или опрос базы данных. Преимущество: Простое решение из коробки.

Недостатки: ваши лимиты не являются динамическими и находятся в вашем файле конфигурации.

Обратите внимание, что вы не должны использовать этот метод, если скорость интернет-сети сильно меняется.

Ответ 2

Очень просто настроить сервер ретрансляции UDP для простых потоков UDP, которые затем можно использовать для дросселирования трафика по мере необходимости. Вы можете поместить это в свое приложение, чтобы все было автономным, и ваш сервер ретрансляции знает, когда сделаны веб-запросы. Создайте один UdpClient для приема трафика на 127.0.0.1 и подключите библиотеку потокового видео, а не к вашему фактическому серверу. Затем создайте другой UdpClient, который будет передавать трафик фактическому адресату, к которому вы обычно подключаетесь, с библиотекой.

Вы можете ограничить пропускную способность любым количеством способов с помощью этого метода и, как вы это сделаете, в конечном итоге будет зависеть от ваших требований. Вы можете просто приостановить пересылку кадров UDP всякий раз, когда вы запускаете веб-запрос, и возобновите отправку их после получения ответа, если приостановка является приемлемой. Если нет, то вы можете отслеживать средние UDP-кадры/секунду при передаче данных и динамическом ограничении до 50% (или что-то еще) от этого, вставляя соответствующие задержки на ваш сервер ретрансляции, пока у вас есть ожидающий веб-запрос.

Здесь вы можете посмотреть пример простой реализации сервера ретрансляции UDP для DNS-запросов, основной принцип будет таким же:

https://social.msdn.microsoft.com/Forums/en-US/ce062e62-395f-4110-a4dd-3e9ed3c88286/udp-relay-server?forum=netfxnetcom