如何在Windows版C ++中检测拨号,宽带或者无线Internet连接?

时间:2020-03-06 14:21:53  来源:igfitidea点击:

我有一个安装程序(只是一个常规的C ++ MFC程序,而不是基于Windows Installer的安装程序),需要根据Internet连接的类型(宽带,拨号和/或者无线)设置一些注册表值。现在,通过询问一系列的是或者否问题来确定此信息。问题在于进行安装的人不是拥有和使用计算机的人,因此他们并不总是确定这些问题的答案应该是什么。有没有办法以编程方式确定这些信息中的任何一个?该代码使用Windows XP及更高版本的C ++(和可选的MFC)编写。基于.NET的解决方案不是一个选择,因为我不需要在运行安装程序之前就确定是否已安装框架。

要澄清的是,问题主要是无线和拨号连接不是"始终在线",这导致我们的产品需要以其他方式运行,因为我们的服务器并不总是可用。因此,严格的速度测量解决方案将无济于事,尽管存在与速度有关的设置,以使产品在连接时不会尝试通过拨号连接发送MB信息。

解决方案

最好的选择是获取默认的活动网络连接,确保它是Internet连接(ping google.com或者类似网络),然后询问它是哪种设备。我们应该能够从中确定用户的连接。

我相当有信心这是可能的,但是不确定如何去做。

[我不知道如何确切地获得我们所要求的信息,但是...]也许我们可以(为自己)改写要完成的工作?就像,而不是询问"用户是否有宽带或者拨号上网",而是询问"用户的互联网连接有多少带宽",然后我们可以尝试在没有任何用户输入的情况下回答已表述的问题(例如测量带宽)。

顺便提一句。如果仅向用户询问"宽带或者拨号",则可能会遇到一些问题:

  • 如果用户具有我们没有想到的某种连接类型,该怎么办?
  • 如果用户不知道该怎么办(因为只有一条以太网电缆连接到PPPoE DSL调制解调器/路由器)?
  • 如果用户通过一系列连接(通过拨号的VPN到其他具有宽带的网络)连接怎么办?

在这些情况下,要求"功能"而不是"类型"可能会更有用。

我认为我们应该进行快速的连接速度测试。只需下载一些特定大小的文件,花费时间多长时间,我们就会知道速度。我同意另一个人的观点,不要问他们有什么类型的连接,更重要的是速度。也许明年他们会推出100兆位拨号上网...我们是否希望使用此惊人新设备的每个人都能获得糟糕的低带宽版本的应用程序?

关于"互联网连接是否永久?"的问题:

  • 最好的方法可能是使应用程序足够健壮,以始终应对非永久性连接:-),这与拨号和宽带相同。
  • 或者,也许我们可​​以找出用户的互联网连接已经建立了多长时间,并与系统正常运行时间进行比较?如果连接几乎在计算机运行时就一直在线,则可能是永久连接。

无论如何,对于晦涩的连接类型,这些试探法可能会失败。

另外,关于不发送大量数据的观点:如果人们实行"宽带+低流量限制"资费,即使带宽允许,我们也不应发送大量数据:-)

正如我们所暗示的,我同意Oliver的观点:我们已经具有应付连接丢失的功能,为什么不默认启用它。

...

使用InternetGetConnectedState API检索Internet连接状态。

我测试了它,并且效果很好。

我发现此文档可以:

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