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

问题描述:

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

为了澄清,问题主要在于无线和拨号连接不是“永远在线”,这就需要我们的产品采取不同的行为方式,因为我们的服务器并不总是可用。因此,严格的速度测量解决方案将无济于事,尽管存在一个与速度相关的设置,以便产品在连接后不会尝试通过拨号连接发送MB信息。

使用的InternetGetConnectedState API来检索互联网连接状态。

我测试了它,它工作正常。

我发现这个文件,它可以帮助:

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

最好的办法是抢到默认的活动网络连接,确保它是互联网连接(ping google.com或类似),然后询问它是什么类型的设备。您应该能够确定用户拥有什么连接。

我相当有信心这是可能的,但不知道如何去解决它。

+0

我试图避免让设备和自己的班级名单,因为总会有人想出了一个我没有想到的,但我同意它可能变得有必要。 – jeffm 2008-09-18 15:35:15

[我不知道如何得到你所要求的信息,但是...]也许你可以改变(为你自己)你试图完成什么?比如,不要询问“用户是否有宽带或拨号”,而是询问“用户的互联网连接有多少带宽” - 然后您可以尝试在没有任何用户输入(如通过测量带宽)的情况下回答改写的问题。

Btw。如果你问用户只是为了“宽带或拨号”,你可能会遇到一些问题:

  • 如果用户有一些你没有预料到的连接类型,该怎么办?
  • 如果用户不知道(因为只有一根以太网电缆连接到PPPoE DSL调制解调器/路由器)会怎么样?
  • 如果用户正在通过一系列连接的连接(通过拨号VPN,一种具有宽带某种其它网络?)

问计“能力”,而不是“类型”可能是在那些更有用案例。

+0

好点。请参阅上面的说明。 – jeffm 2008-09-18 15:55:27

我认为你应该做一个快速的连接速度测试。只需下载一些特定大小的文件,时间需要多长时间,并且您将知道速度。我同意其他人的看法,不要问他们是什么类型的连接,更重要的是速度。也许明年他们会拿出100mbit的拨号...你想让每个人都使用这个惊人的新设备来获得应用程序的蹩脚的低带宽版本吗?

关于这个问题:“是互联网连接永久性的或不呢?”:

  • 最好的办法是可能使应用程序强大到足以总是应付非永久连接:-)这将与拨号和宽带一样工作...
  • 或者,您可以了解用户的互联网连接已建立了多长时间,并与系统正常运行时间进行比较?如果连接在线时间几乎与计算机运行时间一样长,则可能是永久连接。

无论如何,这些启发式可能会因为模糊的连接类型而失败。

此外,关于有关未发送大量数据点:如果人们有一个“宽带+低流量限制”的关税,你不应该发送大量数据或者即使带宽允许:-)

+0

关于应对连接类型的程序设计的要点。有这样一个原因,但是如果不进入应用程序所做的事情,我不能在公共场合真正做到这一点很难解释。 – jeffm 2008-09-18 17:34:18

我会同意oliver,正如你所暗示的那样:你已经具备了处理连接丢失的功能,为什么不默认启用呢?

宽带连接可以得到搞砸到:routersoftware即冻结(发生了很多对我来说),或poweradapter薯条,...