使用无线托管网络、Internet 连接共享

无线托管网络是 Windows 7 和 Windows 8 支持的新 WLAN 功能。 在安装了无线 LAN 服务的 Windows Server 2012 和 Windows Server 2008 R2 上也支持它。 此功能实现两个主要功能:

  • 将物理无线适配器虚拟化为多个虚拟无线适配器,有时称为虚拟 Wi-Fi。
  • 基于软件的无线接入点 (AP) 有时称为使用指定虚拟无线适配器的 SoftAP。

Internet 连接共享 (ICS) 是 Windows 中通过 SharedAccess 服务提供的一项功能。 严格地说,SharedAccess 允许通过共享网络访问不一定提供 Internet 访问权限的计算机进行网络共享。 我们在本部分中互换使用术语 ICS 和 SharedAccess,因为 Internet 连接共享是无线托管网络的主要方案,并且 ICS 术语更为用户社区所熟知。

无线托管网络与 ICS 紧密关联,可实现无线个人区域网络 (PAN) 和 Internet 共享方案。 本部分向应用程序开发人员提供有关如何使用公共无线托管网络和 ICS API 集成无线托管网络和 ICS 的常规建议。

Internet 连接共享

ICS 服务在以下两种可能的模式之一中运行:

  • 独立模式

    调用 ICS 服务时,只有 DHCPv4 服务器函数正在运行。 这是 ICS 的特殊操作模式,只能通过无线托管网络使用。 用户或应用程序无法通过公共 ICS API 或 netsh 命令直接启动和停止独立 ICS。 启动无线托管网络通常涉及在独立模式下启动 ICS,以使用 DHCPv4 服务器功能为连接的设备提供专用 IPv4 地址。 已连接设备的网络通信仅限于在连接的设备与托管无线托管网络的本地计算机之间以及连接的设备本身之间发送和接收网络数据包。 这有效地实现了无线托管网络的无线个人区域网络方案。

  • 完整模式

    调用服务时,ICS 的所有功能都会正常运行,例如 IPv4 和 IPv6 的网络地址转换和 DHCP 服务器功能。 这是 ICS 的正常操作模式。 用户或应用程序可以通过公共 API 或 netshell 命令启动和停止完全 ICS 模式。 例如,可以使用提升的命令提示符中的 net stop sharedaccess 来停止此服务。 将无线托管网络与完整 ICS 相结合,连接的设备的网络通信不限于无线 PAN。 任何连接的设备都可通过运行无线托管网络的计算机的共享网络连接访问网络 (,例如 Internet) 。 这有效地为无线托管网络启用网络共享方案。

在本部分中,我们使用术语“完整 ICS”来表示在 ICS 服务中调用所有 ICS 函数,以便通过无线托管网络提供对所有完整 ICS 功能的访问。

这两种 ICS 操作模式互斥,完整 ICS 具有更高的优先级。 ICS 服务可以从独立模式转换为完整模式,但不能从完整模式转换为独立模式。 ICS 独立模式是在 Windows 7 和 Windows Server 2008 R2 中引入的,其中无线 LAN 服务与无线托管网络功能一起安装。 它在早期版本的 Windows 中不可用。

任何完整的 ICS 操作都涉及系统中的两个不同的网络适配器:

  • 公共接口。 这是可访问 Internet 的网络接口。 运行 ICS 的本地计算机使用此接口与通过 SoftAP 连接到 Internet 的客户端和设备共享 Internet。
  • 专用接口。 这是其他设备用来连接到运行 ICS 的本地计算机的网络接口。 DHCPv4 服务器正在此专用接口上运行,以便向其他远程计算机提供专用本地 IP 地址。

当公共接口无法访问 Internet 时,专用接口上的 DHCP 服务器将继续向连接的设备提供本地 IP 地址。 独立 ICS 仅涉及运行 SoftAP 的专用接口;它不涉及任何公共接口。

在任何时候,本地计算机上最多运行一个完整 ICS 实例。 如果完整的 ICS 已在本地计算机上运行,启动另一个完整的 ICS 会表现出以下功能行为:

  • 如果新的完整 ICS 的公共接口和专用接口与现有完整 ICS 相同,则启动第二个完整 ICS 等效于无操作。
  • 如果新的公共接口与旧的公共接口不同,但新的专用接口与旧的专用接口相同,则启动第二个完整 ICS 对同一专用接口上的连接设备影响不大。 访问 Internet 的能力可能会随着新的公共接口而改变。
  • 如果新的专用接口与旧的专用接口不同,ICS 函数将停止在旧的专用接口上工作,并开始应用到新的专用接口。 任何使用旧专用接口连接到本地计算机的远程设备都将失去与本地计算机的 IP 连接。

当完整 ICS 已在运行时,只要第二个 ICS 集成使用不同的新专用接口,调用第二个完整 ICS 会中断使用旧专用接口的远程连接设备。

若要管理和使用 ICS 服务来支持 ICS 与无线托管网络的集成,软件应用程序必须首先获取 INetSharingManager 接口。 INetSharingManager 接口提供对 ICS API 中所有其他 COM 接口的直接或间接访问。 INetSharingManager 接口上的 get_SharingInstalled 方法报告本地计算机是否支持连接共享。 INetSharingManager 接口上的 get_EnumEveryConnection 方法检索 connections 文件夹中所有连接的枚举接口。 get_INetSharingConfigurationForINetConnection 方法检索指定连接的 INetSharingConfiguration 接口。 INetSharingConfiguration 接口上的方法可用于查询和更改 ICS 设置。

必须先启动无线托管网络,然后才能在 INetSharingManager 接口上调用 get_EnumEveryConnection 方法,以枚举 connections 文件夹中的所有连接。

有关 ICS 以及可用于查询和更改 ICS 设置的公共接口和方法的信息,请参阅 关于 Internet 连接共享和 Internet 连接防火墙的文档。

托管网络和 ICS 集成

未运行完整的 ICS 时,启动无线托管网络还会在独立模式下内部启动 ICS 服务,仅使用 DHCPv4 服务器功能为无线托管网络接口上的已连接设备分配 IP 地址。 独立 DHCPv4 服务器的子网地址范围为 192.168.173.0/24。 这不同于与完整 ICS 一起使用的子网范围 192.168.137.0/24。

使用完整 ICS 启动无线托管网络采用以下逻辑:

  • 如果完整的 ICS 尚未运行,则启动无线托管网络还会启动具有独立 DHCPv4 服务器的 ICS 服务。
  • 如果完整的 ICS 已在运行,并且专用接口是无线托管网络接口,则只需启动无线托管网络。
  • 如果完整的 ICS 已在运行,但专用接口不是无线托管网络接口,则无线托管网络将在无线托管网络接口上没有 DHCPv4 服务器功能的情况下启动。

上述逻辑的影响突出了以下事实:

  • ICS 不会从完整模式转换为独立模式。
  • 当 ICS 未在完整模式下运行时,独立模式只能由无线托管网络调用。
  • 如果 ICS 在独立模式下运行,如果用户或应用程序在完整模式下启动 ICS,它将被抢占到完全模式。
  • 如果完整 ICS 的专用接口与 SoftAP 的专用接口不同,在 ICS 中从独立模式转换为完整模式将对无线 PAN 中的连接设备造成中断。

在本地计算机上以完整或独立模式启动或停止 ICS 服务需要一段时间。 应用程序应使用 NotifyServiceStatusChange 函数检查 ICS 服务的状态,以确保 ICS 服务在启动或停止用于 ICS 集成的无线托管网络之前不处于启动/停止挂起状态。

启动和停止无线托管网络

Windows 提供了一个平台,允许多个并发应用程序同时管理无线托管网络。 具体而言,每个应用程序都可以自行启动和停止无线托管网络,而无需事先了解其他应用程序。

有两组函数可用于启动和停止托管网络。

多个应用程序可能需要使用无线托管网络。 WlanHostedNetworkStartUsingWlanHostedNetworkStopUsing 函数以与其他并发应用程序兼容的方式启动和停止无线托管网络。 WlanHostedNetworkStartUsingWlanHostedNetworkStopUsing 函数允许应用程序引用无线托管网络。 此机制使无线托管网络保持运行,前提是至少有一个其他应用程序具有对无线托管网络的当前引用。 任何用户都可以调用这些函数。 对 WlanHostedNetworkStartUsing 的成功调用必须与对 WlanHostedNetworkStopUsing 函数的调用匹配。 如果调用应用程序通过使用传递给 WlanHostedNetworkStartUsing) 的相同 hClientHandle 参数调用 WlanCloseHandle 来关闭其调用句柄 (,则由 WlanHostedNetworkStartUsing 函数引起的任何托管网络状态更改都会自动撤消,或者进程结束。

WlanHostedNetworkForceStartWlanHostedNetworkForceStop 函数强制启动和停止无线托管网络。 仅当用户具有相应的提升权限时,才能调用这些函数。 成功调用 WlanHostedNetworkForceStart 最终可以通过调用 WlanHostedNetworkForceStop 函数进行匹配,具体取决于应用程序设计。 这些函数转换无线托管网络状态,而无需将请求与应用程序的调用句柄相关联。 如果调用应用程序通过使用传递给 WlanHostedNetworkStartUsing) 的相同 hClientHandle 参数调用 WlanCloseHandle 来关闭其调用句柄 (,则不会自动撤消由 WlanHostedNetworkForceStart 函数引起的任何托管网络状态更改,或者进程结束。 如果调用 WlanHostedNetworkForceStart 函数的应用程序在关闭时未调用其中一个函数来停止无线托管网络,则托管网络保持运行状态。 在确保提升的系统用户接受长时间运行无线托管网络时涉及的电源要求增加后,应用程序可能会调用 WlanHostedNetworkForceStart 函数。

有关调用哪些函数来启动和停止无线托管网络的一般建议如下:

  • 使用应用程序中的 WlanHostedNetworkStartUsingWlanHostedNetworkStopUsing 函数来启动和停止无线托管网络。
  • 请勿使用 WlanHostedNetworkForceStart 函数启动无线托管网络,除非应用程序绝对需要它。 WlanHostedNetworkForceStart 函数还需要提升的权限。
  • 仅使用 WlanHostedNetworkForceStop 函数作为恢复方法。 WlanHostedNetworkForceStop 函数会导致无线托管网络立即停止。 侦听无线托管网络通知的其他应用程序可能需要执行恢复操作。 有关详细信息,请参阅下面有关无线托管网络的恢复顺序的讨论。

无线托管网络的启动序列

对于使用完整 ICS 启动无线托管网络的应用程序,建议启动无线托管网络,然后启动完整的 ICS。 如果无线托管网络已在运行,则仅当需要完整的 ICS 但尚未启用托管网络之前,应用程序才应使用 WlanHostedNetworkForceStop 函数来停止无线托管网络。 这将允许其他应用程序从启动完整 ICS 导致的潜在中断中恢复。 有关详细信息,请参阅下面有关无线托管网络的恢复顺序的讨论。 组合操作应作为一个整体成功和失败。

注意

必须先启动无线托管网络,然后才能尝试使用 IEnumNetSharingEveryConnection 接口枚举相应的适配器。

 

以下有序步骤是使用具有完整 ICS 的无线托管网络的应用程序中建议的启动顺序:

  • 调用 WlanHostedNetworkInitSettings 函数以确保无线托管网络已配置并可供使用。
  • 调用 WlanHostedNetworkQueryStatusWlanHostedNetworkQueryProperty 函数以确定无线托管网络是否允许且可用。 如果无线托管网络不允许且不可用,则返回错误。
  • 测试是否允许用于完整 ICS 的 ICS 服务。 如果 ICS 服务无法启动,则返回错误。
  • 调用 WlanHostedNetworkForceStop 函数以强制停止无线托管网络。
  • 调用 WlanHostedNetworkStartUsing 函数以启动无线托管网络。
  • 如果无线托管网络无法启动,则返回错误。
  • 如果完整的 ICS 已在运行,并且当前公共或专用接口与要使用的新接口不同,请缓存当前公共接口和专用接口。 如果 ICS 集成已在运行,应用程序还可以选择返回错误或提示用户。
  • 使用公共和专用接口的新设置启动完整的 ICS。
  • 如果完整 ICS 无法使用这些设置启动,请尝试使用缓存的公共和专用接口启动完整的 ICS 服务(如果以前运行完整 ICS)。 调用 WlanHostedNetworkForceStop 函数以停止无线托管网络并返回错误。
  • 返回无线托管网络和完整 ICS 成功的成功。

无线托管网络的停止序列

使用具有完整 ICS 的无线托管网络时,已完成其工作的应用程序可能需要停止无线托管网络和用于完整 ICS 的 ICS 服务。 在这种情况下,建议调用 WlanHostedNetworkForceStop 函数来停止托管网络,而不是调用 WlanHostedNetworkStopUsing 函数。 WlanHostedNetworkForceStop 函数停止无线托管网络,还可用于允许其他应用程序恢复。 有关详细信息,请参阅下面有关无线托管网络的恢复顺序的讨论。

以下有序步骤是使用无线托管网络和完整 ICS 的应用程序中建议的停止顺序:

使用未完成完整 ICS 的无线托管网络的应用程序只需调用 WlanHostedNetworkStopUsingWlanHostedNetworkForceStop 函数即可停止无线托管网络。 如果调用 WlanHostedNetworkStartUsing 函数来启动无线托管网络,则应用程序应调用 WlanHostedNetworkStopUsing 函数来停止无线托管网络。 如果在应用程序或应用程序调用 WlanHostedNetworkForceStart 函数以强制启动无线托管网络之前已启动无线托管网络,则应用程序可以调用 WlanHostedNetworkForceStop 函数来停止无线托管网络或不执行任何操作 (使无线托管网络启动) ,具体取决于方案。

无线托管网络的恢复顺序

使用无线托管网络的应用程序可能会受到其他应用程序操作的影响。 ICS 服务和用于管理 ICS 的接口不提供应用程序注册 ICS 更改通知的方法。 如果另一个应用程序调用 INetSharingConfiguration 接口上的 EnableSharing 或 DisableSharing 方法来启用或禁用连接上的共享,则会将消息发送到用户界面 (本地计算机上的屏幕) ,而不是发送到其他应用程序。 因此,当 ICS 或无线托管网络发生更改时,应用程序需要依赖无线托管网络通知来执行恢复操作。

使用无线托管网络的应用程序应通过调用 WlanRegisterNotification 注册无线托管网络通知。 如果仅需要无线托管网络的通知,则应用程序应传递传递给 WlanRegisterNotificationdwNotifSource 参数中的WLAN_NOTIFICATION_SOURCE_HNWK。 如果还需要其他无线通知,则应 将WLAN_NOTIFICATION_SOURCE_HNWK 与所需其他类型的无线通知的通知源常量组合在一起,并在 dwNotifSource 参数中传递此值。

对于具有或不具有完整 ICS 的应用程序,恢复顺序是相同的,前提是应用程序不想再次启动 ICS 服务。 收到无线托管网络通知,指出托管网络已停止后,请执行以下操作:

已连接设备的恢复顺序

连接到无线托管网络的远程设备或计算机可能会受到影响 ICS 和无线托管网络的其他应用程序的操作的影响。 幸运的是,大多数设备在设备应用程序中内置了重试逻辑,以处理暂时丢失的信号或漫游。

连接到无线托管网络但失去联系的设备或计算机的可能恢复顺序如下:

  • 无线设备驱动程序指示媒体与设备上的网络堆栈上层断开连接。
  • 设备应用程序开始定期检查无线托管网络的可用性。
  • 设备应用程序再次检测到无线托管网络后,设备将启动无线连接。
  • 成功连接到无线托管网络后,设备应用程序会相应地更新其 IP 设置。

关于无线托管网络

无线托管网络示例

WlanHostedNetworkForceStart

WlanHostedNetworkInitSettings

WlanHostedNetworkQueryProperty

WlanHostedNetworkQuerySecondaryKey

WlanHostedNetworkQueryStatus

WlanHostedNetworkRefreshSecuritySettings

WlanHostedNetworkSetProperty

WlanHostedNetworkSetSecondaryKey

WlanHostedNetworkStartUsing

WlanHostedNetworkStopUsing

WlanRegisterVirtualStationNotification