溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

VC++ win7下怎么實現WIFI共享工具

發布時間:2021-11-30 16:34:18 來源:億速云 閱讀:216 作者:iii 欄目:互聯網科技

這篇文章主要講解了“ VC++ win7下怎么實現WIFI共享工具”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ VC++ win7下怎么實現WIFI共享工具”吧!

關于無線承載網絡

無線承載網絡(Wireless Hosted Network)是指安裝有無線局域網服務的Windows 7和Windows Server 2008 R2所提供的一種WLAN功能,具備兩項主要功能:

第一、把一個物理無線網卡虛擬化成一個或多個虛擬無線網卡,稱為虛擬的WiFi。

第二、借助無線網卡把當前接網絡虛擬成為一個基于軟件的無線接入點,稱為虛擬AP或軟AP。

=========================萬惡的分割線===========================

項目需要包含wlanapi.h 頭文件和wlanapi.lib 庫

備注:測試環境win7_64,建議關閉一些安全軟件,(比如我測試的時候忘了關comodo導致防火墻總是拒絕其他設備的連接)。

=============================================================

功能不復雜,用到的主要函數有下面幾個

1.調用WlanOpenHandled得到一個連接hClientHandle,下面的操作都要用到這個連接。當然程序退出的時候記得調用WlanCloseHandle關閉這個連接。

DWORD WINAPI WlanOpenHandle(
  _In_        DWORD dwClientVersion,
  _Reserved_  PVOID pReserved,
  _Out_       PDWORD pdwNegotiatedVersion,
  _Out_       PHANDLE phClientHandle
);

DWORD WINAPI WlanCloseHandle(
  _In_        HANDLE hClientHandle,
  _Reserved_  PVOID pReserved
);



2.下面的函數用來設置承載網絡的一些屬性。

DWORD WINAPI WlanHostedNetworkSetProperty(
  _In_        HANDLE hClientHandle,
  _In_        WLAN_HOSTED_NETWORK_OPCODE OpCode,
  _In_        DWORD dwDataSize,
  _In_        PVOID pvData,
  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
  _Reserved_  PVOID pvReserved
);typedef enum _WLAN_HOSTED_NETWORK_OPCODE { 
  wlan_hosted_network_opcode_connection_settings,          //設置一些連接屬性
  wlan_hosted_network_opcode_security_settings,            //設置安全屬性
  wlan_hosted_network_opcode_station_profile,              //query the wireless Hosted Network station profile
  wlan_hosted_network_opcode_enable                        //query or set the wireless Hosted Network enabled flag
} WLAN_HOSTED_NETWORK_OPCODE, *PWLAN_HOSTED_NETWORK_OPCODE;

3.啟用和禁用無線承載網絡。

打開網絡和共享中心 單擊更改適配器設置,如果啟用了無線承載網絡 面板里面就會有描述為Microsoft Virtual WiFi Miniport Adapter的一個虛擬網卡。禁用之后這個虛擬網卡就會消失了。

當然只有啟用了無線承載網絡才能分享wifi啦

DWORD WINAPI WlanHostedNetworkForceStart(
  _In_        HANDLE hClientHandle,
  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
  _Reserved_  PVOID pvReserved
);
DWORD WINAPI WlanHostedNetworkForceStop(
  _In_        HANDLE hClientHandle,
  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
  _Reserved_  PVOID pvReserved
);


4.連接和斷開網絡

DWORD WINAPI WlanHostedNetworkStartUsing(
  _In_        HANDLE hClientHandle,
  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
  _Reserved_  PVOID pvReserved
);
DWORD WINAPI WlanHostedNetworkStopUsing(
  _In_        HANDLE hClientHandle,
  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
  _Reserved_  PVOID pvReserved
);

5.用來查詢承載網絡的網絡狀況。

DWORD WINAPI WlanHostedNetworkQueryStatus(
  _In_        HANDLE hClientHandle,
  _Out_       PWLAN_HOSTED_NETWORK_STATUS *ppWlanHostedNetworkStatus,
  _Reserved_  PVOID pvReserved
);
typedef struct _WLAN_HOSTED_NETWORK_STATUS {
  WLAN_HOSTED_NETWORK_STATE      HostedNetworkState;
  GUID                           IPDeviceID;
  DOT11_MAC_ADDRESS              wlanHostedNetworkBSSID;
  DOT11_PHY_TYPE                 dot11PhyType;
  ULONG                          ulChannelFrequency;
  DWORD                          dwNumberOfPeers;            //已連接的節點數目
  WLAN_HOSTED_NETWORK_PEER_STATE PeerList[1];                //存放節點信息的數組
} WLAN_HOSTED_NETWORK_STATUS, *PWLAN_HOSTED_NETWORK_STATUS;

typedef struct _WLAN_HOSTED_NETWORK_PEER_STATE {
  DOT11_MAC_ADDRESS                   PeerMacAddress;        //節點設備的MAC地址
  WLAN_HOSTED_NETWORK_PEER_AUTH_STATE PeerAuthState;            //節點的認證狀態
} WLAN_HOSTED_NETWORK_PEER_STATE, *PWLAN_HOSTED_NETWORK_PEER_STATE;

調用WlanHostedNetworkQueryStatus將得到一個WLAN_HOSTED_NETWORK_STATUS結構體,就可以查詢一些網絡基本信息了,比如dwNumberOfPeers連接到這個網絡的節點數,PeerList數組存放著對應節點的詳細信息,包括MAC地址和認證狀態。

6.用來設置密碼

注意密碼長度必須 大于8  小于63 否則會調用失敗

DWORD WINAPI WlanHostedNetworkSetSecondaryKey(
  _In_        HANDLE hClientHandle,
  _In_        DWORD dwKeyLength,
  _In_        PUCHAR pucKeyData,
  _In_        BOOL bIsPassPhrase,
  _In_        BOOL bPersistent,
  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
  _Reserved_  PVOID pvReserved
);

======================貼代碼==========================


//WIFIMAIN.h  實現文件
#pragma once
#include <wlanapi.h>
#pragma comment(lib,"wlanapi.lib")

// WIFIMAIN

class WIFIMAIN : public CWnd
{
	DECLARE_DYNAMIC(WIFIMAIN)

public:
	WIFIMAIN();
	virtual ~WIFIMAIN();

protected:
	DECLARE_MESSAGE_MAP()
private:
	bool allow;
	bool start;
	HANDLE hClient;
public:
	int Init(void);
	int AllowHostedNetWork(void);
	int DisallowHostedNetWork(void);
	int StartHostedNetWork(void);
	int StopHostedNetWork(void);
	bool isStart(void);
	bool isAllow(void);
	int Resume(void);
	int getpeernumber(void);
	int SetKEY(CString key);
	int SetSSID(CString ssidname);
};



// WIFIMAIN.cpp : 實現文件
//

#include "stdafx.h"
#include "wifi共享1028.h"
#include "WIFIMAIN.h"


// WIFIMAIN

IMPLEMENT_DYNAMIC(WIFIMAIN, CWnd)

WIFIMAIN::WIFIMAIN()
: allow(false)
, start(false)
{
	Init();
}

WIFIMAIN::~WIFIMAIN()
{
	StopHostedNetWork();
	WlanCloseHandle(hClient, NULL);
}


BEGIN_MESSAGE_MAP(WIFIMAIN, CWnd)
END_MESSAGE_MAP()



// WIFIMAIN 消息處理程序






int WIFIMAIN::Init(void)
{
	DWORD dwCurVersion = 0;
    DWORD dwResult = 0;
    
    dwResult = WlanOpenHandle(WLAN_API_VERSION, NULL, &dwCurVersion, &hClient);
	if( ERROR_SUCCESS != dwResult )
	{
		return -1;
	}


	BOOL bIsAllow = true;
    WLAN_HOSTED_NETWORK_REASON dwFailedReason;
	dwResult = WlanHostedNetworkSetProperty(hClient,
											wlan_hosted_network_opcode_enable, 
											sizeof(BOOL),
											&bIsAllow,
											&dwFailedReason,
											NULL);
	if( ERROR_SUCCESS != dwResult )
	{
		return -2;
	}
	
	return 0;
}


int WIFIMAIN::AllowHostedNetWork(void)
{
	PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
	
	DWORD dwResult= 0;
	dwResult=WlanHostedNetworkForceStart(hClient,pFailReason,NULL);
	if( dwResult != ERROR_SUCCESS )
	{
		return -1;
	}
	allow=true;
	return 0;
}


int WIFIMAIN::DisallowHostedNetWork(void)
{
	PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
	DWORD dwResult= 0;
	dwResult=WlanHostedNetworkForceStop(hClient,pFailReason,NULL);
	if( dwResult != ERROR_SUCCESS )
	{
		return -1;
	}
	allow=false;
	return 0;
}


int WIFIMAIN::StartHostedNetWork(void)
{
	PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
	DWORD dwResult= 0;
	dwResult=WlanHostedNetworkStartUsing(hClient,pFailReason,NULL);
	if( dwResult != ERROR_SUCCESS )
	{
		return -1;
	}
	start=true;
	return 0;
}


int WIFIMAIN::StopHostedNetWork(void)
{
	PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
	DWORD dwResult= 0;
	dwResult=WlanHostedNetworkStopUsing(hClient,pFailReason,NULL);
	if( dwResult != ERROR_SUCCESS )
	{
		return -1;
	}
	start=false;
	return 0;
}



bool WIFIMAIN::isStart(void)
{
	return start;
}


bool WIFIMAIN::isAllow(void)
{
	return allow;
}


int WIFIMAIN::Resume(void)
{
	DWORD dwResult = 0;
    
	BOOL bIsAllow = false;
    WLAN_HOSTED_NETWORK_REASON dwFailedReason;
	dwResult = WlanHostedNetworkSetProperty(hClient,
											wlan_hosted_network_opcode_enable, 
											sizeof(BOOL),
											&bIsAllow,
											&dwFailedReason,
											NULL);
	if( ERROR_SUCCESS != dwResult )
	{
		return -2;
	}
	
	return 0;
}


int WIFIMAIN::getpeernumber(void)
{
	PWLAN_HOSTED_NETWORK_STATUS ppWlanHostedNetworkStatus=NULL;
	int retval = WlanHostedNetworkQueryStatus(hClient,&ppWlanHostedNetworkStatus,NULL);
	if(  retval != ERROR_SUCCESS ){
		return -1;
	}
	return ppWlanHostedNetworkStatus->dwNumberOfPeers;
}


int WIFIMAIN::SetKEY(CString key)
{
	char chkey[64];
	int index;
	for(index=0; index<key.GetLength(); index++ )
	{
		chkey[index] = key[index];
	}
	chkey[index]='\0';


	WLAN_HOSTED_NETWORK_REASON dwFailedReason;
		
	DWORD dwResult= 0;
	dwResult = WlanHostedNetworkSetSecondaryKey(hClient,
												strlen((const char*)chkey) + 1,
												(PUCHAR)chkey,
												TRUE,
												FALSE,
												&dwFailedReason,
												NULL);
    if(ERROR_SUCCESS != dwResult)
    {
       return -1;
    }

	return 0;
}


int WIFIMAIN::SetSSID(CString ssidname)
{
	
	char chname[64];
	int index;
	for(index=0; index<ssidname.GetLength(); index++ )
	{
		chname[index] = ssidname[index];
	}
	chname[index]='\0';
	
	DWORD dwResult= 0;
	WLAN_HOSTED_NETWORK_REASON dwFailedReason;
	WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS cfg;
    memset(&cfg, 0, sizeof(WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS));

	memcpy( cfg.hostedNetworkSSID.ucSSID, chname, strlen(chname)  ) ;
    cfg.hostedNetworkSSID.uSSIDLength = strlen((const char*)cfg.hostedNetworkSSID.ucSSID);
    cfg.dwMaxNumberOfPeers = 20;		//最大連接數    

    dwResult = WlanHostedNetworkSetProperty(hClient, 
											wlan_hosted_network_opcode_connection_settings, 
											sizeof(WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS), 
											&cfg,
											&dwFailedReason,
											NULL);
     if(ERROR_SUCCESS != dwResult )
	 {
		return -1;
	 }

	 return 0;
}

感謝各位的閱讀,以上就是“ VC++ win7下怎么實現WIFI共享工具”的內容了,經過本文的學習后,相信大家對 VC++ win7下怎么實現WIFI共享工具這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女