Как вы обнаруживаете коммутируемые, широкополосные или беспроводные интернет-соединения в C++ для Windows?

У меня есть программа установки (просто обычная программа C++ MFC, а не на основе установщика Windows), которая должна установить некоторые параметры реестра в зависимости от типа подключения к Интернету: широкополосный, коммутируемый и / или беспроводной. Прямо сейчас эта информация определяется путем задания серии вопросов "да" или "нет". Проблема в том, что человек, выполняющий установку, - это не тот человек, который владеет и использует компьютер, поэтому они не всегда уверены, какими должны быть ответы на эти вопросы. Есть ли способ программно определить любую из этой информации? Код написан на C++ (и, возможно, MFC) для Windows XP и выше. Решения, основанные на.NET, не вариант, потому что я не хочу определять, установлена ​​ли инфраструктура, прежде чем наша программа установки сможет работать.

Чтобы уточнить, проблема заключается, главным образом, в том, что беспроводные и коммутируемые соединения не всегда включены, что создает необходимость для нашего продукта вести себя по-другому, потому что наш сервер не всегда доступен. Таким образом, решение для точного измерения скорости не поможет, хотя есть настройка, зависящая от скорости, так что продукт не пытается отправлять МБ информации через коммутируемое соединение, как только он подключается.

6 ответов

Решение

Используйте InternetGetConnectedState API для получения состояния интернет-соединения.

Я проверил это, и он отлично работает.

Я нашел этот документ, который может помочь:

http://www.pcausa.com/resources/InetActive.txt

[Я не знаю, как получить именно ту информацию, которую вы запрашивали, но...] Может быть, вы могли бы перефразировать (для себя), что вы пытаетесь достичь? Например, вместо того, чтобы спрашивать "есть ли у пользователя широкополосная связь или коммутируемый доступ", спрашивайте "сколько пропускной способности имеет интернет-соединение пользователя" - и тогда вы можете попытаться ответить на перефразированный вопрос без какого-либо ввода пользователя (например, путем измерения пропускной способности).

Btw. если вы спросите пользователя только "широкополосный или коммутируемый доступ", вы можете столкнуться с некоторыми проблемами:

  • Что делать, если у пользователя есть тип соединения, который вы не ожидали?
  • что если пользователь не знает (потому что к модему / маршрутизатору PPL PPPoE подключается только кабель Ethernet)?
  • Что делать, если пользователь подключен через серию подключений (VPN через dialup, к какой-либо другой сети, которая имеет широкополосный доступ?)

В таких случаях может быть более полезным запросить "возможности" вместо "тип".

Что касается вопроса "является ли интернет-соединение постоянным или нет?"

  • Наилучшим способом было бы, вероятно, сделать приложение достаточно надежным, чтобы всегда справляться с непостоянным соединением:-), которое работало бы одинаково с dialup и широкополосным доступом...
  • В качестве альтернативы, может быть, вы можете узнать, как давно уже установлено интернет-соединение пользователя, и сравнить с временем работы системы? Если подключение было подключено к сети почти столько же, сколько и компьютер, вероятно, это постоянное подключение.

В любом случае, эта эвристика, вероятно, не удастся для неясных типов соединений.

Кроме того, что касается вопроса об отсутствии отправки большого количества данных: если у людей есть тариф "широкополосный + низкий лимит трафика", вам также не следует отправлять большое количество данных, даже если пропускная способность позволяет:-)

Лучше всего было бы захватить активное сетевое соединение по умолчанию, убедиться, что это интернет-соединение (ping google.com или аналогичное), а затем спросить, какое это устройство. Вы должны быть в состоянии определить из того, какое соединение имеет пользователь.

Я уверен, что это возможно, но не уверен, как это сделать.

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

Широкополосные соединения могут быть испорчены: программно-аппаратное обеспечение маршрутизаторов, которое зависает (часто случается со мной), или энергосберегающий адаптер питания…

Я думаю, что вы должны просто сделать быстрый тест скорости соединения. Просто скачайте файлы определенного размера, сколько времени это займет, и вы узнаете скорость. Я согласен с другим парнем, не спрашивайте их, какой тип связи у них есть, важнее скорость. Возможно, в следующем году они выпустят модем со скоростью 100 Мбит... Хотите, чтобы все, кто использует это удивительное новое устройство, получили дрянную версию вашего приложения с низкой пропускной способностью?

Другие вопросы по тегам