Формирование полосы пропускания в моем приложении С#
У меня есть приложение С#, которое использует собственную библиотеку, которая отправляет видео на другой 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