宿舍用手机连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, |
13 | wlan_hosted_network_opcode_enable |
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; |
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); |
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/
==========================================
转载请以超链接保留本文链接