Como você detectar dial-up, banda larga ou conexões de internet sem fio em C ++ para Windows?
-
01-07-2019 - |
Pergunta
Eu tenho um programa de instalação (apenas um programa regular C ++ MFC, não o Windows Installer com base) que precisa definir alguns valores de registro com base no tipo de conexão à Internet: banda larga, dial-up, e / ou sem fio. Agora esta informação está sendo determinada, pedindo uma série de sim ou não a perguntas. O problema é que a pessoa que faz as instalações não é a mesma pessoa que possui e utiliza o computador, de modo que eles não são sempre certeza do que as respostas a estas perguntas deve ser. Existe uma maneira de determinar programaticamente alguma desta informação? O código é escrito em C ++ (e opcionalmente MFC) para Windows XP e para cima. .NET baseada em soluções não são uma opção, porque eu não quero ter que determinar se o quadro está instalado antes do nosso programa de instalação pode ser executado.
Para esclarecer, a questão é, principalmente, que as conexões sem fio e discadas não são "always-on", o que cria uma necessidade para o nosso produto a se comportar de maneira diferente, porque o nosso servidor não está sempre disponível. Então uma solução estritamente medir velocidades não ajudaria, embora haja uma definição que está a uma velocidade tão dependente que o produto não tentar enviar MB de informações através de uma conexão dial-up, logo que ele se conecta.
Solução
Use InternetGetConnectedState API para recuperar estado de conexão de internet.
Eu testei e funciona bem.
Eu encontrei este documento que pode ajudar:
Outras dicas
[Eu não tenho nenhuma idéia de como obter exatamente a informação que você pediu, mas ...] Talvez você poderia reformular (para si mesmo) o que você tenta realizar? Como, em vez de perguntar "se o usuário tiver banda larga ou dial-up", pergunte "quanto largura de faixa faz ligação à Internet do utilizador tem." - e então você pode tentar responder à questão reformulada, sem qualquer entrada do usuário (como medindo a largura de banda)
Btw. se você perguntar o usuário apenas para "banda larga ou dial-up", que você pode encontrar alguns problemas:
- que se o usuário tem algum tipo de ligação que não previu?
- e se o usuário não sabe (porque há apenas um cabo ethernet ir a um PPPoE DSL modem / router)?
- e se o usuário está conectado através de uma série de conexões (VPN via dial-up, a alguma outra rede que tem banda larga?)
Pedir "capacidades" em vez de "tipo" pode ser mais útil nesses casos.
Em relação à pergunta "é a conexão de internet permanente ou não?":
- melhor maneira seria provavelmente para fazer o suficiente robusta aplicativo para sempre lidar com uma conexão não-permanente :-) que iria trabalhar o mesmo com dial-up e banda larga ...
- Em alternativa, talvez você possa descobrir quanto tempo conexão de internet do usuário foi já estabelecido, e comparar com a disponibilidade do sistema? Se a conexão foi em linha por quase tanto tempo quanto o computador estava funcionando, é provavelmente uma conexão permanente.
De qualquer forma, estas heurísticas irá provavelmente falhar por tipos de conexão obscuros.
Além disso, em relação ao ponto de não enviar grandes quantidades de dados: se as pessoas têm uma "banda larga + tráfego baixo limite" tarifa, você não deve enviar grandes quantidades de dados, quer mesmo que a largura de banda permite: -)
A melhor aposta seria para pegar a conexão de rede ativa padrão, garantir que ele é uma conexão de internet (ping google.com ou similar) e, em seguida, pedir-lhe que tipo de dispositivo que é. Você deve ser capaz de determinar a partir de que o que conexão o usuário tem.
Estou bastante confiante de que isso é possível, mas não sei como fazê-lo embora.
Eu acho que você deve apenas fazer um teste de conexão de velocidade rápida. Basta baixar alguns arquivos específicos de tamanho, tempo quanto tempo leva, e você saberá a velocidade. Concordo com o outro cara, não pedir-lhes que tipo de conexão que eles têm, o que é mais importante é a velocidade. Talvez no próximo ano eles saem com 100Mbit discada ... você quer todos usando este novo dispositivo incrível para obter a versão lowbandwidth porcaria do seu aplicativo?
Eu concordo com oliver, como você implica: você já tem a funcionalidade para lidar com a perda de conexão, por que não permitir que por padrão
.conexões de banda larga pode ficar confuso para: routersoftware que congela (acontece muito para mim), ou poweradapter que batatas fritas, ...