宿舍用手机连wifi总是要用浏览器登录联通的wlan登陆页面,无奈手机太挫内存只有512M,开个网页再干其他的事情就卡的要死,所以果断下载了个wifi共享精灵。用了一次就果断卸载了,为啥呢?竟然有广告,受不了啊。正好在学VC++ 算了自己做一个吧。 
关于无线承载网络
无线承载网络(Wireless Hosted Network)是指安装有无线局域网服务的Windows 7和Windows Server 2008 R2所提供的一种WLAN功能,具备两项主要功能:
第一、把一个物理无线网卡虚拟化成一个或多个虚拟无线网卡,称为虚拟的WiFi。
第二、借助无线网卡把当前接网络虚拟成为一个基于软件的无线接入点,称为虚拟AP或软AP。
=========================万恶的分割线===========================
项目需要包含wlanapi.h 头文件和wlanapi.lib 库
备注:测试环境win7_64,建议关闭一些安全软件,(比如我测试的时候忘了关comodo导致防火墙总是拒绝其他设备的连接)。
=============================================================
功能不复杂,用到的主要函数有下面几个
1.调用WlanOpenHandled得到一个连接hClientHandle,下面的操作都要用到这个连接。当然程序退出的时候记得调用WlanCloseHandle关闭这个连接。
01
|
DWORD
WINAPI WlanOpenHandle(
|
02
|
_In_
DWORD
dwClientVersion,
|
03
|
_Reserved_
PVOID
pReserved,
|
04
|
_Out_ PDWORD pdwNegotiatedVersion,
|
05
|
_Out_
PHANDLE
phClientHandle
|
08
|
DWORD
WINAPI WlanCloseHandle(
|
09
|
_In_
HANDLE
hClientHandle,
|
10
|
_Reserved_
PVOID
pReserved
|
2.下面的函数用来设置承载网络的一些属性。
01
|
DWORD
WINAPI WlanHostedNetworkSetProperty(
|
02
|
_In_
HANDLE
hClientHandle,
|
03
|
_In_ WLAN_HOSTED_NETWORK_OPCODE OpCode,
|
04
|
_In_
DWORD
dwDataSize,
|
06
|
_Out_opt_ PWLAN_HOSTED_NETWORK_REASON pFailReason,
|
07
|
_Reserved_
PVOID
pvReserved
|
09
|
<pre><span style=
"color:Blue;"
>
typedef
</span> <span style=
"color:Blue;"
>
enum
</span> _WLAN_HOSTED_NETWORK_OPCODE {
|
10
|
wlan_hosted_network_opcode_connection_settings,
//设置一些连接属性
|
11
|
wlan_hosted_network_opcode_security_settings,
//设置安全属性
|
12
|
wlan_hosted_network_opcode_station_profile,
//query the wireless Hosted Network station profile
|
13
|
wlan_hosted_network_opcode_enable
//query or set the wireless Hosted Network enabled flag
|
14
|
} WLAN_HOSTED_NETWORK_OPCODE, *PWLAN_HOSTED_NETWORK_OPCODE;
|
3.启用和禁用无线承载网络。
打开网络和共享中心 单击更改适配器设置,如果启用了无线承载网络 面板里面就会有描述为Microsoft Virtual WiFi Miniport Adapter的一个虚拟网卡。禁用之后这个虚拟网卡就会消失了。
当然只有启用了无线承载网络才能分享wifi啦
1
|
DWORD
WINAPI WlanHostedNetworkForceStart(
|
2
|
_In_
HANDLE
hClientHandle,
|
3
|
_Out_opt_ PWLAN_HOSTED_NETWORK_REASON pFailReason,
|
4
|
_Reserved_
PVOID
pvReserved
|
1
|
DWORD
WINAPI WlanHostedNetworkForceStop(
|
2
|
_In_
HANDLE
hClientHandle,
|
3
|
_Out_opt_ PWLAN_HOSTED_NETWORK_REASON pFailReason,
|
4
|
_Reserved_
PVOID
pvReserved
|
4.连接和断开网络
1
|
DWORD
WINAPI WlanHostedNetworkStartUsing(
|
2
|
_In_
HANDLE
hClientHandle,
|
3
|
_Out_opt_ PWLAN_HOSTED_NETWORK_REASON pFailReason,
|
4
|
_Reserved_
PVOID
pvReserved
|
1
|
DWORD
WINAPI WlanHostedNetworkStopUsing(
|
2
|
_In_
HANDLE
hClientHandle,
|
3
|
_Out_opt_ PWLAN_HOSTED_NETWORK_REASON pFailReason,
|
4
|
_Reserved_
PVOID
pvReserved
|
5.用来查询承载网络的网络状况。
1
|
DWORD
WINAPI WlanHostedNetworkQueryStatus(
|
2
|
_In_
HANDLE
hClientHandle,
|
3
|
_Out_ PWLAN_HOSTED_NETWORK_STATUS *ppWlanHostedNetworkStatus,
|
4
|
_Reserved_
PVOID
pvReserved
|
01
|
typedef
struct
_WLAN_HOSTED_NETWORK_STATUS {
|
02
|
WLAN_HOSTED_NETWORK_STATE HostedNetworkState;
|
04
|
DOT11_MAC_ADDRESS wlanHostedNetworkBSSID;
|
05
|
DOT11_PHY_TYPE dot11PhyType;
|
06
|
ULONG
ulChannelFrequency;
|
07
|
DWORD
dwNumberOfPeers;
//已连接的节点数目
|
08
|
WLAN_HOSTED_NETWORK_PEER_STATE PeerList[1];
//存放节点信息的数组
|
09
|
} WLAN_HOSTED_NETWORK_STATUS, *PWLAN_HOSTED_NETWORK_STATUS;
|
11
|
typedef
struct
_WLAN_HOSTED_NETWORK_PEER_STATE {
|
12
|
DOT11_MAC_ADDRESS PeerMacAddress;
//节点设备的MAC地址
|
13
|
WLAN_HOSTED_NETWORK_PEER_AUTH_STATE PeerAuthState;
//节点的认证状态
|
14
|
} WLAN_HOSTED_NETWORK_PEER_STATE, *PWLAN_HOSTED_NETWORK_PEER_STATE;
|
调用WlanHostedNetworkQueryStatus将得到一个WLAN_HOSTED_NETWORK_STATUS结构体,就可以查询一些网络基本信息了,比如dwNumberOfPeers连接到这个网络的节点数,PeerList数组存放着对应节点的详细信息,包括MAC地址和认证状态。
6.用来设置密码
注意密码长度必须 大于8 小于63 否则会调用失败
1
|
DWORD
WINAPI WlanHostedNetworkSetSecondaryKey(
|
2
|
_In_
HANDLE
hClientHandle,
|
3
|
_In_
DWORD
dwKeyLength,
|
4
|
_In_
PUCHAR
pucKeyData,
|
5
|
_In_
BOOL
bIsPassPhrase,
|
7
|
_Out_opt_ PWLAN_HOSTED_NETWORK_REASON pFailReason,
|
8
|
_Reserved_
PVOID
pvReserved
|
======================贴代码==========================
04
|
#pragma comment(lib,"wlanapi.lib")
|
08
|
class
WIFIMAIN :
public
CWnd
|
10
|
DECLARE_DYNAMIC(WIFIMAIN)
|
24
|
int
AllowHostedNetWork(
void
);
|
25
|
int
DisallowHostedNetWork(
void
);
|
26
|
int
StartHostedNetWork(
void
);
|
27
|
int
StopHostedNetWork(
void
);
|
31
|
int
getpeernumber(
void
);
|
32
|
int
SetKEY(CString key);
|
33
|
int
SetSSID(CString ssidname);
|
001
|
// WIFIMAIN.cpp : 实现文件
|
005
|
#include "wifi共享1028.h"
|
006
|
#include "WIFIMAIN.h"
|
011
|
IMPLEMENT_DYNAMIC(WIFIMAIN, CWnd)
|
020
|
WIFIMAIN::~WIFIMAIN()
|
023
|
WlanCloseHandle(hClient, NULL);
|
027
|
BEGIN_MESSAGE_MAP(WIFIMAIN, CWnd)
|
039
|
int
WIFIMAIN::Init(
void
)
|
041
|
DWORD
dwCurVersion = 0;
|
044
|
dwResult = WlanOpenHandle(WLAN_API_VERSION, NULL, &dwCurVersion, &hClient);
|
045
|
if
( ERROR_SUCCESS != dwResult )
|
051
|
BOOL
bIsAllow =
true
;
|
052
|
WLAN_HOSTED_NETWORK_REASON dwFailedReason;
|
053
|
dwResult = WlanHostedNetworkSetProperty(hClient,
|
054
|
wlan_hosted_network_opcode_enable,
|
059
|
if
( ERROR_SUCCESS != dwResult )
|
068
|
int
WIFIMAIN::AllowHostedNetWork(
void
)
|
070
|
PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
|
073
|
dwResult=WlanHostedNetworkForceStart(hClient,pFailReason,NULL);
|
074
|
if
( dwResult != ERROR_SUCCESS )
|
083
|
int
WIFIMAIN::DisallowHostedNetWork(
void
)
|
085
|
PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
|
087
|
dwResult=WlanHostedNetworkForceStop(hClient,pFailReason,NULL);
|
088
|
if
( dwResult != ERROR_SUCCESS )
|
097
|
int
WIFIMAIN::StartHostedNetWork(
void
)
|
099
|
PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
|
101
|
dwResult=WlanHostedNetworkStartUsing(hClient,pFailReason,NULL);
|
102
|
if
( dwResult != ERROR_SUCCESS )
|
111
|
int
WIFIMAIN::StopHostedNetWork(
void
)
|
113
|
PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
|
115
|
dwResult=WlanHostedNetworkStopUsing(hClient,pFailReason,NULL);
|
116
|
if
( dwResult != ERROR_SUCCESS )
|
126
|
bool
WIFIMAIN::isStart(
void
)
|
132
|
bool
WIFIMAIN::isAllow(
void
)
|
138
|
int
WIFIMAIN::Resume(
void
)
|
142
|
BOOL
bIsAllow =
false
;
|
143
|
WLAN_HOSTED_NETWORK_REASON dwFailedReason;
|
144
|
dwResult = WlanHostedNetworkSetProperty(hClient,
|
145
|
wlan_hosted_network_opcode_enable,
|
150
|
if
( ERROR_SUCCESS != dwResult )
|
159
|
int
WIFIMAIN::getpeernumber(
void
)
|
161
|
PWLAN_HOSTED_NETWORK_STATUS ppWlanHostedNetworkStatus=NULL;
|
162
|
int
retval = WlanHostedNetworkQueryStatus(hClient,&ppWlanHostedNetworkStatus,NULL);
|
163
|
if
( retval != ERROR_SUCCESS ){
|
166
|
return
ppWlanHostedNetworkStatus->dwNumberOfPeers;
|
170
|
int
WIFIMAIN::SetKEY(CString key)
|
174
|
for
(index=0; index<key.GetLength(); index++ )
|
176
|
chkey[index] = key[index];
|
181
|
WLAN_HOSTED_NETWORK_REASON dwFailedReason;
|
184
|
dwResult = WlanHostedNetworkSetSecondaryKey(hClient,
|
185
|
strlen
((
const
char
*)chkey) + 1,
|
191
|
if
(ERROR_SUCCESS != dwResult)
|
200
|
int
WIFIMAIN::SetSSID(CString ssidname)
|
205
|
for
(index=0; index<ssidname.GetLength(); index++ )
|
207
|
chname[index] = ssidname[index];
|
212
|
WLAN_HOSTED_NETWORK_REASON dwFailedReason;
|
213
|
WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS cfg;
|
214
|
memset
(&cfg, 0,
sizeof
(WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS));
|
216
|
memcpy
( cfg.hostedNetworkSSID.ucSSID, chname,
strlen
(chname) ) ;
|
217
|
cfg.hostedNetworkSSID.uSSIDLength =
strlen
((
const
char
*)cfg.hostedNetworkSSID.ucSSID);
|
218
|
cfg.dwMaxNumberOfPeers = 20;
//最大连接数
|
220
|
dwResult = WlanHostedNetworkSetProperty(hClient,
|
221
|
wlan_hosted_network_opcode_connection_settings,
|
222
|
sizeof
(WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS),
|
226
|
if
(ERROR_SUCCESS != dwResult )
|
==========================================
这里只贴出了比较重要的代码,其他的略去了,需要的可以去我的网盘下载完整项目代码。
代码和程序下载:http://pan.baidu.com/s/1GI0kG
程序只完成了基本功能,还有待完善,但是学习的过程还是很有意思的。
下面是几篇关于无线承载网络比较不错的文章,当时对我帮助很大。
关于无线承载网络http://blog.wbpluto.com/2010/08/about-wireless-hosted-network/
==========================================
转载请以超链接保留本文链接