浅谈Windows共享网络热点开发

xiaoxiao2021-02-27  270

http://freehacker.cn/developing/system/win-wifi/?utm_source=tuicool&utm_medium=referral

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

市面上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,这里仅仅是一个局域网络,实现这个基本功能,我们仍然是不能使用其来连接外网的。可是实现这一步也是必须的一步。

启动前准备

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

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

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

WinmgmtALGBFEWlansvcMpsSvciphlpsvcdot3svcWwanSvcSharedAccessWZCSVC

启动前准备二:启动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的设置方法,可以通过命令行:

1 $ 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的若干问题

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

一些难以解决的问题

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

Some Tips

下面是一些有用的链接,帮助我们完成可能存在的额外工作:

How to change the Network name shown in Windows’s ncpa.cpl using C++?如何判断网卡是有线网卡还是无线网卡How does Windows know which network adapter is a wireless device?Configuring an INF File for a Modifying Filter Driver寻找正在连接中的网络连接,并开启网络连接的网络连接共享功能
转载请注明原文地址: https://www.6miu.com/read-4409.html

最新回复(0)