无线托管网络是 Windows 7 和 Windows 8 支持的新 WLAN 功能。 只要安装了无线 LAN 服务,Windows Server 2012 和 Windows Server 2008 R2 也支持该配置。 此功能实现两个主要功能:
- 物理无线适配器虚拟化为多个虚拟无线适配器,有时称为虚拟 Wi-Fi。
- 基于软件的无线接入点(AP)有时称为使用指定虚拟无线适配器的 SoftAP。
Internet 连接共享(ICS)是通过 SharedAccess 服务提供的 Windows 中的一项功能。 严格来说,SharedAccess 是通过一台计算机进行网络共享,该计算机的共享网络访问不一定提供访问互联网的权限。 在本部分中,术语 ICS 和 SharedAccess 可互换使用,因为在无线托管网络的主要方案中,Internet 连接共享更为关键,而 ICS 术语更为用户社区熟知。
无线托管网络与 ICS 紧密相连,可实现无线个人区域网络(PAN)和 Internet 共享方案。 本部分向应用程序开发人员提供有关如何使用公共无线托管网络和 ICS API 集成无线托管网络和 ICS 的一般建议。
网络连接共享
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)。 这有效地为无线托管网络实现了网络共享功能。
在本部分中,我们使用术语 full 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 相当于 no-op。
- 如果新的公共接口不同于旧的公共接口,但新的专用接口与旧的专用接口相同,则启动第二个完整的 ICS 对同一专用接口上的连接设备的影响不大。 访问 Internet 的能力可能会随新的公共接口而改变。
- 如果新的专用接口不同于旧的专用接口,ICS 函数将停止处理旧专用接口并开始应用于新的专用接口。 使用旧专用接口连接到本地计算机的任何远程设备都将失去与本地计算机的 IP 连接。
当完全 ICS 正在运行时,调用第二个完整的 ICS 会对仍在使用旧专用接口的远程连接设备造成中断,只要第二个 ICS 集成使用了不同的新专用接口。
若要管理和使用 ICS 服务来支持 ICS 与无线托管网络的集成,软件应用程序必须首先获取 INetSharingManager 接口。 INetSharingManager 接口提供对 ICS API 中所有其他 COM 接口的直接或间接访问。 INetSharingManager 接口上的 get_SharingInstalled 方法报告本地计算机是否支持连接共享。 INetSharingManager 接口上的 get_EnumEveryConnection 方法检索连接文件夹中所有连接的枚举接口。 get_INetSharingConfigurationForINetConnection方法检索指定连接的 INetSharingConfiguration 接口。 INetSharingConfiguration 接口上的方法可用于查询和更改 ICS 设置。
必须在 INetSharingManager 接口上调用 get_EnumEveryConnection 方法以枚举连接文件夹中的所有连接之前启动无线托管网络。
有关 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 提供了一个平台,允许多个并发应用程序同时管理无线托管网络。 具体而言,每个应用程序都可以自行启动和停止无线托管网络,而无需事先了解其他应用程序。
有两组函数可以启动和停止托管网络。
多个应用程序可能需要使用无线托管网络。 WlanHostedNetworkStartUsing 和 WlanHostedNetworkStopUsing 函数以与其他并发应用程序兼容的方式启动和停止无线托管网络。 WlanHostedNetworkStartUsing 和 WlanHostedNetworkStopUsing 函数允许应用程序引用无线托管网络。 此机制使无线托管网络保持运行,前提是至少有一个其他应用程序具有对无线托管网络的当前引用。 任何用户可以调用这些函数。 对 WlanHostedNetworkStartUsing 的成功调用必须与 对 WlanHostedNetworkStopUsing 函数的调用匹配。 如果调用应用程序关闭其调用句柄(通过调用与传递给 WlanHostedNetworkStartUsing 的相同 hClientHandle 参数调用 WlanCloseHandle),或者进程结束,WlanHostedNetworkStartUsing 导致的任何托管网络状态更改将自动撤消。
WlanHostedNetworkForceStart 和 WlanHostedNetworkForceStop 函数强制启动和停止无线托管网络。 仅当用户具有适当的提升权限时,才能调用这些函数。 对 WlanHostedNetworkForceStart 的成功调用最终可能与对 WlanHostedNetworkForceStop 函数的调用匹配,具体取决于应用程序设计。 这些函数转换无线托管网络状态,而无需将请求与应用程序的调用句柄相关联。 由WlanHostedNetworkForceStart函数引起的任何托管网络状态更改,如果调用应用程序关闭其调用句柄(通过调用WlanCloseHandle并使用相同的hClientHandle参数传递给WlanHostedNetworkStartUsing)或进程结束,都不会自动撤销。 如果调用 WlanHostedNetworkForceStart 函数的应用程序关闭而不调用其中一个函数来停止无线托管网络,则托管网络将保持运行状态。 应用程序可以在确保具有管理员权限的系统用户接受长时间运行无线托管网络所需的更高电源需求之后调用 WlanHostedNetworkForceStart 函数。
有关如何调用以启动和停止无线托管网络的函数的一般建议如下:
- 使用应用程序中的 WlanHostedNetworkStartUsing 和 WlanHostedNetworkStopUsing 函数启动和停止无线托管网络。
- 请勿使用 WlanHostedNetworkForceStart 函数启动无线托管网络,除非应用程序绝对需要它。 WlanHostedNetworkForceStart 函数还需要提升的权限。
- 仅使用 WlanHostedNetworkForceStop 函数作为恢复方法。 WlanHostedNetworkForceStop 函数导致无线托管网络立即停止。 侦听无线托管网络通知的其他应用程序可能需要执行恢复操作。 有关详细信息,请参阅以下有关无线托管网络的恢复顺序的讨论。
无线托管网络的启动序列
对于启动具有完整 ICS 的无线托管网络的应用程序,建议启动无线托管网络,然后启动完整的 ICS。 如果无线托管网络正在运行,则应用程序应使用 WlanHostedNetworkForceStop 函数停止无线托管网络,前提是需要完整的 ICS,但在启动托管网络之前尚未启用。 这将使其他应用程序能够更好地从完整 ICS 的启动所引起的潜在中断中恢复。 有关详细信息,请参阅以下有关无线托管网络的恢复顺序的讨论。 组合作应整体成功或失败。
注释
必须先启动无线托管网络,然后再尝试使用 IEnumNetSharingEveryConnection 接口枚举相应的适配器。
在具有完整 ICS 的无线托管网络的应用程序中,以下按顺序的步骤是推荐的启动顺序:
- 调用 WlanHostedNetworkInitSettings 函数,确保已配置无线托管网络并准备好使用。
- 调用 WlanHostedNetworkQueryStatus 和 WlanHostedNetworkQueryProperty 函数,以确定是否允许和可用无线托管网络。 如果不允许无线托管网络且不可用,则返回错误。
- 测试以确保用于完整 ICS 的 ICS 服务被允许。 如果无法启动 ICS 服务,则返回错误。
- 调用 WlanHostedNetworkForceStop 函数以强制停止无线托管网络。
- 调用 WlanHostedNetworkStartUsing 函数以启动无线托管网络。
- 如果无线托管网络无法启动,则返回错误。
- 如果正在运行完整的 ICS 并且当前公共或专用接口与要使用的新接口不同,请缓存当前公共接口和专用接口。 如果 ICS 集成已在运行,应用程序还可以选择返回错误或提示用户。
- 使用公共接口和专用接口的新设置启动完整的 ICS。
- 如果完整的 ICS 无法启动这些设置,请尝试使用缓存的公共接口和专用接口启动完整的 ICS 服务(如果之前正在运行完整的 ICS)。 调用 WlanHostedNetworkForceStop 函数以停止无线托管网络并返回错误。
- 返回无线托管网络和 ICS 操作成功的结果。
无线托管网络的停止序列
将无线托管网络与完整的 ICS 配合使用时,已完成其工作的应用程序可能需要停止无线托管网络和用于完整 ICS 的 ICS 服务。 在这种情况下,建议调用 WlanHostedNetworkForceStop 函数以停止托管网络,而不是调用 WlanHostedNetworkStopUsing 函数。 WlanHostedNetworkForceStop 函数停止无线托管网络,还可用于允许其他应用程序恢复。 有关详细信息,请参阅以下有关无线托管网络的恢复顺序的讨论。
以下有序步骤是使用无线托管网络和完整 ICS 的应用程序中建议的停止顺序:
- 停止整个 ICS 系统。
- 调用 WlanHostedNetworkForceStop 函数以停止无线托管网络。
使用没有完整 ICS 的无线托管网络的应用程序只需调用 WlanHostedNetworkStopUsing 或 WlanHostedNetworkForceStop 函数即可停止无线托管网络。 如果调用 WlanHostedNetworkStartUsing 函数以启动无线托管网络,则应用程序应调用 WlanHostedNetworkStopUsing 函数来停止无线托管网络。 如果在应用程序启动之前或应用程序调用 WlanHostedNetworkForceStart 函数以强制启动无线托管网络之前,无线托管网络已经启动,则应用程序可以调用 WlanHostedNetworkForceStop 函数来停止无线托管网络,或者不进行任何操作(保持无线托管网络运行),具体取决于情况。
无线托管网络的恢复顺序
使用无线托管网络的应用程序可能会受到其他应用程序的作的影响。 ICS 服务和用于管理 ICS 的接口没有为应用程序注册 ICS 更改通知的方法。 如果另一个应用程序调用 INetSharingConfiguration 接口上的 EnableSharing 或 DisableSharing 方法以启用或禁用连接上的共享,则会将消息发送到本地计算机上的用户界面(屏幕)而不是其他应用程序。 因此,当 ICS 或无线托管网络发生更改时,应用程序需要依赖无线托管网络通知来执行恢复作。
使用无线托管网络的应用程序应通过调用 WlanRegisterNotification 注册无线托管网络通知。 如果仅需要无线托管网络的通知,则应用程序应在传递给 WlanRegisterNotification 的 dwNotifSource 参数中传递WLAN_NOTIFICATION_SOURCE_HNWK。 如果需要其他无线表示法,则应将 WLAN_NOTIFICATION_SOURCE_HNWK 与所需的其他类型的无线通知的通知源常量组合在一起,并在 dwNotifSource 参数中传递此值。
如果应用程序不想再次启动 ICS 服务,则恢复顺序与具有或不完全 ICS 的应用程序相同。 收到托管网络已停止的无线通知后,请执行以下操作:
- 如果应用程序名为 WlanHostedNetworkForceStart 以启动无线托管网络,则通过调用 WlanHostedNetworkForceStart 重启托管网络。 否则,请调用 WlanHostedNetworkStartUsing 以重启无线托管网络。
连接的设备的恢复顺序
连接到无线托管网络的远程设备或计算机可能会受到影响 ICS 和无线托管网络的其他应用程序的作的影响。 幸运的是,大多数设备在设备应用程序中内置了重试逻辑,以处理暂时丢失信号或漫游。
连接到失去联系的无线托管网络的设备或计算机的可能恢复顺序如下:
- 无线设备驱动程序指示媒体断开到设备上的网络堆栈上层的连接。
- 设备应用程序开始定期检查无线托管网络的可用性。
- 设备应用程序再次检测到无线托管网络后,设备将启动无线连接。
- 成功连接到无线托管网络后,设备应用程序会相应地更新其 IP 设置。
相关主题