浅谈Windows共享网络热点开发

小龙 2017-5-19 最新资讯 0 0

思考比工具更重要,发挥才智远优于理性,行动比分析更为迫切。

市面上WiFi热点软件竞争激烈,猎豹WiFi、360WiFi、WiFi共享精灵等等产品在WiFi热点方面已经做得很成熟。但这总是其他人家的产品,对于一个新手来说,如何很快的开发出一款稳定的WiFi热点产品呢?基于分享互助的观点,这里将自己从事WiFi热点开发的经验写成博文。

几个基本知识点

开发一款WiFi热点软件需要知道哪些知识?我们先来看看这几个基本知识点,帮助我们更快的上手。

Windows无线承载网络

如果不需要连接外部网络的功能,实现Windows无线承载网络,就已经实现了一款WiFi热点软件了。多简单,从百度上搜搜别人博客上实现的代码,从谷歌上搜搜开源的代码——有一个C#开源项目已经实现该功能。的确很简单,不过即使是不需要连接外部网络,这点实现也是不够的。

ICS

Internet Connection Sharing,网络连接共享,为WiFi热点提供连接外部热点的功能。大多数人使用WiFi热点软件,主要就是为了方便移动设备连接网络。

MSDN的Native WiFi一节给出了Windows无线承载网络和ICS的详尽讲解,读懂了这里的讲解,也就能实现最简单的WiFi热点功能。

为什么说是最简单的呢?那是因为你还会遇到下面问题:

你可能开启不了热点 移动端可能连接不上该热点 移动端连接上了却没法上网 连接上了一直掉线

这些问题,都会在本文后面给出解决方案或者原因分析——解决不了呀。

DHCP

ICS提供了基本的DHCP功能,不过千万不要太指望它,我们还是老老实实的自己实现一个DHCP服务。DHCP协议内容,网络上很多,开源的DHCP服务器代码不稳定,自己实现DHCP服务更能保证正确性。

NAT

NAT,Network Address Translator,网络地址转换,主要作用是把内网IP地址转换成为全球唯一的可定位的外部IP地址,从而使得局域网内的所有用户可以通过一个或者少数几个IP地址与全球的Internet通信——不仅节约了IP地址,而且在一定程度上保护了内部网络。

我们这儿使用NAT也是为了提供一个类似ICS的功能,实际上微软的ICS也是简版的NAT。

基本的网络共享功能开发

Windows无线承载网络提供最基本的网络共享功能,然而由于未加入ICS/NAT,这里仅仅是一个局域网络,实现这个基本功能,我们仍然是不能使用其来连接外网的。可是实现这一步也是必须的一步。

启动前准备

在启动无线承载网络之前,需要有一些准备步骤,用来确定当前系统环境适合无线承载网络的启动。

这些准备步骤是重中之重,如果没有这些准备步骤,启动失败的概率会大大提高。

启动前准备一:开启无线承载网络所需服务,这些服务有可能会被关闭,必须要主动检测服务是否正常运行。具体服务包括:

Winmgmt ALG BFE Wlansvc MpsSvc iphlpsvc dot3svc WwanSvc SharedAccess WZCSVC

启动前准备二:启动DHCP服务,并检测服务是否正常运行。DHCP服务后文会提及。

启动前准备三:判断是否存在无线网卡,如果没有无线网卡,网络共享功能只是空谈。

启动前准备四:检测无线网卡是否支持无限承载网络。

启动前准备五:检测无线网卡是否被禁用,如果被禁用就重启。

调用流程

基本功能的实现主要依赖于对MSDN相关文档的深入阅读,本节不会翻译这篇文章,本节的重点是基本功能实现的调用流程。

MSDN: Using Wireless Hosted Network and Internet Connection Sharing

调用流程一:初始化无线承载网络信息。

设置无线承载网络可开启:调用WlanHostedNetworkSetProperty函数设置wlan_hosted_network_opcode_enable属性为TRUE; 设置无线承载网络基本信息:调用WlanHostedNetworkSetProperty函数设置wlan_hosted_network_opcode_connection_settings属性,需要设置SSID、连接用户数; 设置密码键值:调用WlanHostedNetworkSetSecondaryKey设置密码信息

调用流程二:启动无线承载网络。

关闭已经启动的无线承载网络:调用WlanHostedNetworkForceStop函数; 启动无线承载网络:调用WlanHostedNetworkStartUsing函数; 保存无线承载网络GUID信息:调用WlanHostedNetworkQueryStatus函数获取PWLAN_HOSTED_NETWORK_STATUS信息中的IPDeviceID值

调用流程三:启动失败自修复。

使用SetupAPI禁用设备并重新打开设备:这段可能需要百度/谷歌/MSDN寻找SetupAPI的使用方法,有可能需要多次禁用和启动,直到网络状态非wlan_hosted_network_unavailable; 重新启动无线承载网络

上述流程没有涉及到具体代码的撰写,主要阐述需要调用的函数和操作。

DHCP

在启动无限承载网络后,如果这时用手机连接热点,会发现手机无线网络一直都卡在获取IP地址的地方。这是因为这个时候无线承载网络并没有提供DHCP功能——ICS能够提供该功能,如果已经开启ICS,是能够获取到IP的,缺陷是不稳定,很有可能无法分配IP。

所以就需要我们自己实现一个DHCP服务,Google一下你就会发现不少开源的服务,选择一个仔细调试。否则你很有可能被这个水土不服的家伙坑了。你必须要了解DHCP的原理、能够分析抓包获取的数据。(推荐博文 DHCP协议原理及报文分析以及 DHCP报文精细分析_加上wireshark抓包)

DHCP服务需要绑定一个静态IP,这个静态IP的设定必须要正确。可以设置一个IP库,防止IP和主机IP冲突。具体静态IP的设置方法,可以通过命令行:

$ netsh interface ip set address ..。

不过这个设置是需要找到对于那个的无限承载网络命名信息,这个信息定义在”SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{GUID Get Before}\Connection”下。

DHCP实现的最终效果要能满足下面需求:

无线承载网络开启时,能够给移动端快速的分配IP地址; 不能影响电脑本身所在局域网中的DHCP服务; 不能导致IP分配冲突

ICS

Windows通过ICS提供基本的网络共享功能。ICS共享网络的流程如下:

通过获取HostedNetwork接口GUID 获取外网接口GUID,需要判断该网络是否能够连接外部网络 通过调用EnableSharing开启ICS网络共享

NAT

首先,我们需要知道NAT的原理,具体参考 NAT原理与NAT穿越。

然后,需要对中间层驱动有一定的了解。参考下列文献:

基于IMD的包过滤防火墙原理与实现 基于PassThru的NDIS中间层驱动程序扩展1 如何把NDIS Filter框架利用到日常的Windows驱动开发工作中 NDIS中间层的驱动包截获技术教程 基于PassThru的NDIS中间层驱动程序扩展 NDIS中间层驱动开发在Win7系统下和Windows XP系统下的区别 NAT在NDIS中间层驱动中的实现 NDIS开发[网络驱动开发] Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform) 用NDIS中的passthru实现NAT的若干问题

这一块的代码我也只实现了一半,仅列出参考的一些文献。

一些难以解决的问题

最重要的问题就是稳定性问题,经过多方求证,目前主要和系统以及无线网卡驱动有关。此问题暂时不可解。

转载请注明来自华盟网,本文标题:《浅谈Windows共享网络热点开发》

喜欢 (0) 发布评论