Определение занятости интернет-соединения
-
29-10-2019 - |
Вопрос
Мы разрабатываем приложение, которое будет установлено на ПК и будет выполнять некоторую фоновую загрузку и загрузку на / с нашего сервера. Одно из требований - определить, занято ли в настоящее время подключение к Интернету (например, загрузка превышает 50%), и если это так, ему необходимо откатиться и попробовать в другой раз. Основная причина - убедиться, что приложение не мешает работе пользователей, если они находятся в процессе игры, смотрят онлайн-фильмы или активно скачивают файлы.
После долгих размышлений и исследований в Google и, конечно, ТАК, я все еще не нашел хорошего способа реализовать это, поэтому решил выбросить это здесь. Приложение реализовано на C #, .NET 4.0, и я ищу все формы ответов - либо реализацию на C # или других языках, псевдологию или подход к достижению - измерение использования интернет-трафика на локальный компьютер с достаточно хорошей точностью.
Чтобы избежать дублирования усилий, до сих пор я пробовал эти (и почему они не подходят)
- Используйте WMI для получения статистики сети. Большинство сообщений и решений SO, так как называть это подходом, но он не соответствует нашим требованиям, поскольку измерение количества отправленных / полученных байтов в зависимости от пропускной способности сетевого интерфейса (например, 1 ГБ Ethernet-карты) для использования даст хороший показатель для трафика LAN но не для интернет-трафика (где фактическая пропускная способность Интернета может составлять только 8 Мбит / с)
- Использование статистики сетевой информации .NET или счетчика производительности - показания аналогичны приведенным выше, следовательно, имеют те же недостатки.
- Используйте ICMP (Ping) и измерьте RTT. Было высказано предположение, что RTT в 400 мс считается медленным и хорошим показателем для загруженной сети, однако мне сказали, что пользователь с модемом (да, мы должны поддерживать это), использование обратного прокси или микроволнового канала часто получает пинг выше, что, следовательно, не очень хорошо измерить
- Начните загрузку известного файла и измерьте скорость - это само по себе генерирует трафик, которого мы пытаемся избежать, а также, если эта проверка выполняется достаточно часто, наше приложение в конечном итоге создаст большой интернет-трафик, что опять же не идеально
- MOD: использование BITS - эта служба может быть отключена на компьютере пользователя, требует изменения групповой политики и предполагает, что сервером является IIS (с пользовательской конфигурацией), а в нашем случае наш сервер не IIS.
Так вот, я запуталась и ищу совета. Я выделил текст вопроса, чтобы вы, ребята, не потерялись, читая это и задаваясь вопросом, в чем вопрос. Спасибо.
Решение
Вы можете использовать UPnP для запроса маршрутизатора и получения количества байтов, отправленных и полученных по сети.Вы можете продолжать проверять это значение на маршрутизаторе, чтобы определить, что это за активность.К сожалению, эта функция не выглядит хорошо документированной, но можно реализовать функциональность связи UPnP в приложении C #.Вам нужно будет использовать UDP для запроса маршрутизатора (обнаружение UPnP), и после того, как вы найдете устройство, запросите его функциональность, а затем запросите количество пакетов, отправленных и полученных для устройства Интернет-шлюза с помощью WebClient (TCP).
родовое слово родовое словоДругие советы
Думали ли вы об использовании Фоновая интеллектуальная служба передачи (BITS) .Он уже предназначен для этой работы:
<цитата>Фоновая интеллектуальная служба передачи (BITS) передает файлы (скачивает или выгружает) между клиентом и сервером и предоставляет информацию о ходе передачи.Вы также можете скачивать файлы с однорангового узла.
и
<цитата>Сохраняйте скорость отклика других сетевых приложений.
Я не уверен, есть ли для него управляемый интерфейс (я вижу ссылку на командлеты Powershell), поэтому вам, возможно, придется использовать COM-взаимодействие для его использования.
Делая предположение, что вы ориентируетесь на ПК с Windows (как вы сказали, что разрабатываете на C #), смотрели ли вы на BITS , фоновая интеллектуальная служба передачи?
Есть примеры того, как подключиться к нему с помощью C # в MSDN и других местах, например http://msdn.microsoft.com/en-us/magazine/cc188766.aspx