Вопрос

Мы разрабатываем приложение, которое будет установлено на ПК и будет выполнять некоторую фоновую загрузку и загрузку на / с нашего сервера. Одно из требований - определить, занято ли в настоящее время подключение к Интернету (например, загрузка превышает 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top