亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++程序中使用Windows系統(tǒng)Native Wifi API的基本教程

2020-05-23 14:07:11
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++程序中使用Windows系統(tǒng)Native Wifi API的基本教程,包括在程序中控制無線網(wǎng)卡開關(guān)的方法,需要的朋友可以參考下
 

Windows應(yīng)用想要實現(xiàn)連接wifi,監(jiān)聽wifi信號,斷開連接等功能,用NativeWifi API是個不錯的選擇。

打開MSDN,搜索NativeWifi Api,找到Native Wifi頁。在這里

信息量很大,如果像我著急實現(xiàn)上述功能,看海量的文檔有些來不及。如果直接給我例子,在運行中調(diào)試,閱讀代碼,效率會更高。
但是,我并沒有成功。首先,Sample在SDK中,參見這里。我下載幾次都失敗了,最后放棄這條路。后來同事給了我一份Sample,我不敢確定是否就是這個,但是代碼寫的也是很晦澀。我的初衷是簡單的使用這些API的例子。

看來還是自己動手吧??聪嚓P(guān)API,如果不懂,就找有經(jīng)驗人的例子。

幾經(jīng)周折,終于實現(xiàn)我的需求。讓我慢慢道來。
1.獲得可用AP列表
參見WlanGetAvailableNetworkList的官方文檔,下面有例子。

DWORD WINAPI WlanGetAvailableNetworkList(  _In_  HANDLE hClientHandle,  _In_  const GUID *pInterfaceGuid,  _In_  DWORD dwFlags,  _Reserved_ PVOID pReserved,  _Out_  PWLAN_AVAILABLE_NETWORK_LIST *ppAvailableNetworkList ); 

由可用列表便可以找到當(dāng)前哪個AP正在連接,并顯示信號強(qiáng)度。
2.監(jiān)聽當(dāng)前連接
在獲得可用AP列表的基礎(chǔ)上,遍歷當(dāng)前AP,看誰正在連接,并取得它的信號。代碼片段如下:

bool isConnect = false; int numberOfItems = pWLAN_AVAILABLE_NETWORK_LIST->dwNumberOfItems;   for(int i = 0; i <= numberOfItems; i++)   {    WLAN_AVAILABLE_NETWORK wlanAN = pWLAN_AVAILABLE_NETWORK_LIST->Network[i];    if(wlanAN.dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)    {     Wprintf(WLAN signal is %s:%d/n", wlanAN.strProfileName, wlanAN.wlanSignalQuality);     isConnect = true;        }   }   if(!isConnect){     wprintf("Wifi is disconnected!/n");} 

3.斷開連接
如果wifi處于連接狀態(tài),將其斷開。WlanDisconnect還是容易使用的。原型如下:

DWORD WINAPI WlanDisconnect(  _In_  HANDLE hClientHandle,  _In_  const GUID *pInterfaceGuid,  _Reserved_ PVOID pReserved ); 

代碼演示在后面。
4.連接一個有profile的AP(已保存過密碼)
這是本文的重點。
雖然連接函數(shù)WlanConnect原型很簡單:

DWORD WINAPI WlanConnect(  _In_  HANDLE hClientHandle,  _In_  const GUID *pInterfaceGuid,  _In_  const PWLAN_CONNECTION_PARAMETERS pConnectionParameters,  _Reserved_ PVOID pReserved ); 
但參數(shù)PWLAN_CONNECTION_PARAMETERS卻是很復(fù)雜,只要有一個配錯,連接就會失敗。
還好我的需求還是蠻簡單的,只要連接已有的profile的AP。那么我的工作就會有針對性的開展。挫折了好多天,每次都連接失敗,原因是ERROR_INVALID_PARAMETER。
就在今天,我終于成功了。真是會者不難,難者不會啊。
看看連接參數(shù)的結(jié)構(gòu)體:
typedef struct _WLAN_CONNECTION_PARAMETERS {  WLAN_CONNECTION_MODE wlanConnectionMode;  LPCWSTR    strProfile;  PDOT11_SSID   pDot11Ssid;  PDOT11_BSSID_LIST pDesiredBssidList;  DOT11_BSS_TYPE  dot11BssType;  DWORD    dwFlags; } WLAN_CONNECTION_PARAMETERS, *PWLAN_CONNECTION_PARAMETERS; 

為了實現(xiàn)我的要求,可以這樣賦值:
wlanConnectionMode這里設(shè)成wlan_connection_mode_profile;
strProfile寫上你要連接ap的名稱(通常是profile名稱);
pDot11Ssid用不上,設(shè)置NULL;
pDesiredBssidList同樣置成NULL;
dot11BssType我給設(shè)成dot11_BSS_type_infrastructure(基礎(chǔ)設(shè)施?);
dwFlags設(shè)置為WLAN_CONNECTION_HIDDEN_NETWORK。
確實是工作了,strProfile如何獲取呢?參見監(jiān)聽連接信號中對可用AP列表中第一個profile的獲取。
完整代碼如下:

// #include "stdafx.h" #include <windows.h> #include <wlanapi.h> #include <objbase.h> #include <wtypes.h> #include <string> #include <stdio.h> #include <stdlib.h>  // Need to link with Wlanapi.lib and Ole32.lib #pragma comment(lib, "wlanapi.lib") #pragma comment(lib, "ole32.lib")  using namespace std;  int listenStatus() {  HANDLE hClient = NULL;  DWORD dwMaxClient = 2;    DWORD dwCurVersion = 0;  DWORD dwResult = 0;  DWORD dwRetVal = 0;  int iRet = 0;    WCHAR GuidString[39] = {0};  //Listen the status of the AP you connected.  while(1){   Sleep(5000);   PWLAN_INTERFACE_INFO_LIST pIfList = NULL;//I think wlan interface means network card   PWLAN_INTERFACE_INFO pIfInfo = NULL;    DWORD dwFlags = 0;       dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);   if (dwResult != ERROR_SUCCESS) {    wprintf(L"WlanOpenHandle failed with error: %u/n", dwResult);    return 1;   }    dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);   if (dwResult != ERROR_SUCCESS) {    wprintf(L"WlanEnumInterfaces failed with error: %u/n", dwResult);    return 1;   } else {     wprintf(L"WLAN_INTERFACE_INFO_LIST for this system/n");     wprintf(L"Num Entries: %lu/n", pIfList->dwNumberOfItems);    wprintf(L"Current Index: %lu/n/n", pIfList->dwIndex);    int i;    for (i = 0; i < (int) pIfList->dwNumberOfItems; i++) {     pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];     wprintf(L" Interface Index[%u]:/t %lu/n", i, i);     iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString,      sizeof(GuidString)/sizeof(*GuidString));      if (iRet == 0)      wprintf(L"StringFromGUID2 failed/n");     else {      wprintf(L" InterfaceGUID[%d]: %ws/n",i, GuidString);     }      wprintf(L" Interface Description[%d]: %ws", i,      pIfInfo->strInterfaceDescription);     wprintf(L"/n");      wprintf(L" Interface State[%d]:/t ", i);     switch (pIfInfo->isState) {     case wlan_interface_state_not_ready:      wprintf(L"Not ready/n");      break;     case wlan_interface_state_connected:      wprintf(L"Connected/n");      break;     case wlan_interface_state_ad_hoc_network_formed:      wprintf(L"First node in a ad hoc network/n");      break;     case wlan_interface_state_disconnecting:      wprintf(L"Disconnecting/n");      break;     case wlan_interface_state_disconnected:      wprintf(L"Not connected/n");      break;     case wlan_interface_state_associating:      wprintf(L"Attempting to associate with a network/n");      break;     case wlan_interface_state_discovering:      wprintf(L"Auto configuration is discovering settings for the network/n");      break;     case wlan_interface_state_authenticating:      wprintf(L"In process of authenticating/n");      break;     default:      wprintf(L"Unknown state %ld/n", pIfInfo->isState);      break;     }    }   }  } }  int _tmain(int argc, _TCHAR* argv[]) {   HANDLE hClient = NULL;  DWORD dwMaxClient = 2;    DWORD dwCurVersion = 0;  DWORD dwResult = 0;  DWORD dwRetVal = 0;  int iRet = 0;    /* variables used for WlanEnumInterfaces */   PWLAN_INTERFACE_INFO_LIST pIfList = NULL;  PWLAN_INTERFACE_INFO pIfInfo = NULL;   LPCWSTR pProfileName = NULL;  LPWSTR pProfileXml = NULL;  DWORD dwFlags = 0;    pProfileName = argv[1];    wprintf(L"Information for profile: %ws/n/n", pProfileName);    dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);  if (dwResult != ERROR_SUCCESS) {   wprintf(L"WlanOpenHandle failed with error: %u/n", dwResult);   return 1;  }   dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);  if (dwResult != ERROR_SUCCESS) {   wprintf(L"WlanEnumInterfaces failed with error: %u/n", dwResult);   return 1;  } else {   dwResult = WlanDisconnect(hClient, &pIfList->InterfaceInfo[0].InterfaceGuid,NULL);//DISCONNECT FIRST   if(dwResult != ERROR_SUCCESS)   {    printf("WlanDisconnect failed with error: %u/n",dwResult);    return -1;   }   PWLAN_AVAILABLE_NETWORK_LIST pWLAN_AVAILABLE_NETWORK_LIST = NULL;   dwResult = WlanGetAvailableNetworkList(hClient, &pIfList->InterfaceInfo[0].InterfaceGuid,     WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES,     NULL, &pWLAN_AVAILABLE_NETWORK_LIST);   if (dwResult != ERROR_SUCCESS)   {       printf("WlanGetAvailableNetworkList failed with error: %u/n",dwResult);    WlanFreeMemory(pWLAN_AVAILABLE_NETWORK_LIST);    return -1;   }   WLAN_AVAILABLE_NETWORK wlanAN = pWLAN_AVAILABLE_NETWORK_LIST->Network[0];//PLEASE CHECK THIS YOURSELF   if(pProfileName == NULL)    pProfileName = wlanAN.strProfileName;    WLAN_CONNECTION_PARAMETERS wlanConnPara;   wlanConnPara.wlanConnectionMode =wlan_connection_mode_profile ; //YES,WE CONNECT AP VIA THE PROFILE   wlanConnPara.strProfile =pProfileName;       // set the profile name   wlanConnPara.pDot11Ssid = NULL;         // SET SSID NULL   wlanConnPara.dot11BssType = dot11_BSS_type_infrastructure;  //dot11_BSS_type_any,I do not need it this time.     wlanConnPara.pDesiredBssidList = NULL;       // the desired BSSID list is empty   wlanConnPara.dwFlags = WLAN_CONNECTION_HIDDEN_NETWORK;   //it works on my WIN7/8    dwResult=WlanConnect(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,&wlanConnPara ,NULL);   if (dwResult==ERROR_SUCCESS)   {    printf("WlanConnect success!/n");   }   else   {    printf("WlanConnect failed err is %d/n",dwResult);   }  }   listenStatus(); //LISTEN THE STATUS   if (pProfileXml != NULL) {   WlanFreeMemory(pProfileXml);   pProfileXml = NULL;  }   if (pIfList != NULL) {   WlanFreeMemory(pIfList);   pIfList = NULL;  }  return dwRetVal; } 

 
5.打開網(wǎng)絡(luò)設(shè)置界面
遇到以前沒有連接過的AP,需要輸入密碼,那么,直接打開配置界面讓用戶自己來搞吧。

ShellExecute(  NULL,  L"open",  L"shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}//::{38a98528-6cbf-4ca9-8dc0-b1e1d10f7b1b}",  NULL,  NULL,  SW_SHOWNORMAL); 

6.RSSI
當(dāng)屏幕上打印出“WlanConnect success!”的時候,別提多高興了。
就像愛迪生試驗燈絲一下,在無數(shù)次失敗后,終于找到了一種材料可以勝任燈絲的工作。這種喜悅真的令人振奮,往日的陰霾和不爽終于一掃而光。
其實我也嘗試過WlanGetProfile和WlanSetProfile,雖然有時結(jié)果是能夠連上指定AP,但是函數(shù)返回結(jié)果卻總是ERROR_INVALID_PARAMETER。
網(wǎng)上的例子,很多都是抄來抄去的,寫的不明不白,雖然有過幫助,但是也有些誤導(dǎo)。
今天自己成功的連接到指定AP了(用命令行運行我的例子,輸入?yún)?shù)profile name),我一定要把它發(fā)表出來,讓其他人有個參考。
我認(rèn)為這是一件誠意的作品,在此也謝謝給過我?guī)椭呐笥选?br /> 最后說一下獲得的信號。標(biāo)準(zhǔn)信號RSSI是負(fù)值,而這里獲得的信號都是正值(0~100),在有些需要RSSI的地方,我們需要轉(zhuǎn)換一下:

if (pBssEntry->wlanSignalQuality == 0)   iRSSI = -100;  else if (pBssEntry->wlanSignalQuality == 100)    iRSSI = -50;  else   iRSSI = -100 + (pBssEntry->wlanSignalQuality/2);     wprintf(L" Signal Quality[%u]:/t %u (RSSI: %i dBm)/n", j,   pBssEntry->wlanSignalQuality, iRSSI); 

     
7.Wifi on與wifi off
下面要說的是在軟件層面控制無線網(wǎng)卡的開和關(guān)。
問題聽起來簡單,調(diào)查起來復(fù)雜,但解決起來卻也簡單。關(guān)鍵函數(shù)便是Native wifi api中的WlanSetInterface。其實這個API功能也是非
常強(qiáng)大的,我只用到其中控制wifi radio state的功能。官網(wǎng)文檔在此
函數(shù)原型:

DWORD WINAPI WlanSetInterface(  _In_  HANDLE hClientHandle,  _In_  const GUID *pInterfaceGuid,  _In_  WLAN_INTF_OPCODE OpCode,  _In_  DWORD dwDataSize,  _In_  const PVOID pData,  _Reserved_ PVOID pReserved ); 

重點說一下三個參數(shù):
(1) OpCode,指定要設(shè)置的參數(shù)。我們選擇wlan_intf_opcode_radio_state
(2) DwDataSize,pData的size。傳入時用sizeof得到。
(3) pData,radio state對應(yīng)的data是WLAN_PHY_RADIO_STATE。
看看這個state結(jié)構(gòu)體:

typedef struct _WLAN_PHY_RADIO_STATE {  DWORD    dwPhyIndex;  DOT11_RADIO_STATE dot11SoftwareRadioState;  DOT11_RADIO_STATE dot11HardwareRadioState; } WLAN_PHY_RADIO_STATE, *PWLAN_PHY_RADIO_STATE; 

Index設(shè)為0.
State設(shè)置如下:

typedef enum _DOT11_RADIO_STATE {  dot11_radio_state_unknown,  dot11_radio_state_on,  dot11_radio_state_off } DOT11_RADIO_STATE, *PDOT11_RADIO_STATE; 

與前幾個API(比如wlanconnect)相比,這個函數(shù)的使用簡單多了。全部源碼如下:

// ManageWirelessNetwork.cpp : Defines the entry point for the console application. //  #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <shellapi.h> #include <wlanapi.h>  // Need to link with shell32.lib #pragma comment(lib, "shell32.lib") #pragma comment(lib, "wlanapi.lib")  int _tmain(int argc, _TCHAR* argv[]) {  DWORD dwResult = 0;  DWORD dwMaxClient = 2;  DWORD dwCurVersion = 0;  HANDLE hClient = NULL;  PWLAN_INTERFACE_INFO_LIST pIfList = NULL;  PWLAN_INTERFACE_INFO pIfInfo = NULL;   dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);  if (dwResult != ERROR_SUCCESS) {   wprintf(L"WlanOpenHandle failed with error: %u/n", dwResult);   return false;  }   dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);  if (dwResult != ERROR_SUCCESS) {   wprintf(L"WlanEnumInterfaces failed with error: %u/n", dwResult);   return false;  }    WLAN_PHY_RADIO_STATE state;  state.dwPhyIndex = 0;  state.dot11SoftwareRadioState = dot11_radio_state_on;  PVOID pData = &state;   dwResult = WlanSetInterface(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,   wlan_intf_opcode_radio_state,sizeof(WLAN_PHY_RADIO_STATE),pData,NULL);   if(dwResult == ERROR_SUCCESS)  {   wprintf(L"set state success!/n");  }  else  {   wprintf(L"set state failed!err is %d/n",dwResult);  }   return 0; } 

8.GOTO在釋放資源時的作用
GOTO語句有著很臭的名聲,我們的老師經(jīng)常教導(dǎo)我們說,不要輕易使用它。
C++跳轉(zhuǎn)語句有三個:goto、break和continue。它們只是工具,我覺得問題不能歸咎于工具,問題在于人。
就像指針一樣,goto這個無條件跳轉(zhuǎn)語句力量還是很強(qiáng)大的,如果濫用,出現(xiàn)問題很難排查。
但有些時候goto確實是不二選擇,例如我遇到的,在函數(shù)中有多個出口,而每個出口都遇到釋放資源的時候,與其都把釋放語句不厭其煩的寫一遍,
不如一個goto語句來的干脆利落。
下面的例子取自上一篇Native Wifi API文章,由于我們的程序經(jīng)常控制的wifi的on和off,必須注意釋放資源。就拿WlanOpenHandle來說,
如果不注意對稱WlanCloseHandler,程序幾次運行后報錯:ERROR_REMOTE_SESSION_LIMIT_EXCEEDED
官網(wǎng)解釋為:Too many handles have been issued by the server.
所以我們會在每個API調(diào)用后,確認(rèn)返回值,如果錯誤,程序?qū)⒉辉倮^續(xù)向下運行,return之前,我們必須釋放資源。當(dāng)出口很多時,我們要寫很多同樣的代碼,
很煩躁,難讀,代碼急速膨脹。但使用goto后,問題便輕松了許多,請看簡單例子:

// ManageWirelessNetwork.cpp : Defines the entry point for the console application. //  #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <shellapi.h> #include <wlanapi.h>  // Need to link with shell32.lib #pragma comment(lib, "shell32.lib") #pragma comment(lib, "wlanapi.lib")  int _tmain(int argc, _TCHAR* argv[]) {   DWORD dwResult = 0;   DWORD dwMaxClient = 2;   DWORD dwCurVersion = 0;   HANDLE hClient = NULL;   PWLAN_INTERFACE_INFO_LIST pIfList = NULL;   PWLAN_INTERFACE_INFO pIfInfo = NULL;    dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);   if (dwResult != ERROR_SUCCESS) {     wprintf(L"WlanOpenHandle failed with error: %u/n", dwResult);     return false;   }    dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);   if (dwResult != ERROR_SUCCESS) {     wprintf(L"WlanEnumInterfaces failed with error: %u/n", dwResult);     goto RELEASE_RESOURCE;   }      WLAN_PHY_RADIO_STATE state;   state.dwPhyIndex = 0;   state.dot11SoftwareRadioState = dot11_radio_state_on;//off here too.   PVOID pData = &state;    dwResult = WlanSetInterface(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,     wlan_intf_opcode_radio_state,sizeof(WLAN_PHY_RADIO_STATE),pData,NULL);    if(dwResult == ERROR_SUCCESS)   {     wprintf(L"set state success!/n");   }   else   {     wprintf(L"set state failed!err is %d/n",dwResult);   } RELEASE_RESOURCE:   if(hClient)   {     WlanCloseHandle(hClient,NULL);     hClient = NULL;   }   if(pIfList)   {     WlanFreeMemory(pIfList);     pIfList = NULL;   }   if(pIfInfo)   {     WlanFreeMemory(pIfInfo);     pIfInfo = NULL;   }   return 0; } 

最后,goto還會用來跳出多重循環(huán)。但需要注意的是,只能從內(nèi)層跳到外層,不可逆操作。

 

后記:
其實幾個月前就要實現(xiàn)windows上的wifi on和off,問了許多人,發(fā)了許多帖子,最后都不了了之。之后的日子里也發(fā)生了許多事。國內(nèi)的
搜索無果,加上google的無法使用,都對調(diào)查增加了些許難度。我們把重點先放到了native wifi api的幾個方法,見上一篇玩轉(zhuǎn)文章。但
那并不是我想要的。
原以為windows也會想android一樣,普通應(yīng)用沒有權(quán)限來控制wifi的開關(guān)呢,結(jié)果并不是這樣。這也宣告了之前我的判斷失誤。
直到今天,通過Bing發(fā)現(xiàn)了幾條線索。那是通過C#調(diào)用native wifi api的問題,里面提及了之前并沒有重視的wlansetinterface。
Interface,在這里我覺得可以理解成無線網(wǎng)卡。類似的WlanEnumInterfaces中實現(xiàn)的功能是羅列出當(dāng)前無線網(wǎng)卡。
無線網(wǎng)卡的設(shè)置,其中有一項是radio的狀態(tài)。
果然,這一切都有了了斷。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
91精品综合| fc2人成共享视频在线观看| 天堂在线免费视频| 免费在线看成人av| 色一情一乱一伦一区二区三区丨| 国产成人无码一区二区在线观看| 国产在线观看免费视频软件| 影音先锋中文字幕一区二区| 久久观看最新视频| 亚洲一区二区偷拍| 日韩影视在线| 伊人网视频在线| 欧美连裤袜在线视频| 日日草天天草| 后进极品白嫩翘臀在线视频| 九九热精品视频在线播放| 欧美疯狂爱爱xxxxbbbb| 丰满少妇在线观看| 一本色道久久综合亚洲精品小说| 精品国产一区二区三区久久狼5月| 91丨九色丨黑人外教| 久久久999精品视频| 精品一区二区在线视频| 有码一区二区三区| 日日噜噜夜夜狠狠久久波多野| 136导航精品福利| 国产精品天美传媒入口| 国产91精品一区二区麻豆网站| 中文字幕av在线一区二区三区| 日本一区二区三区久久| 完整版免费av片| 国产乱色在线观看| hs视频在线观看| 欧美激情乱人伦一区| 日韩av中文在线| 天天摸天天操天天爽| 欧美日韩国产经典色站一区二区三区| 国产一区二区三区网| 米奇四色影视| 欧美亚洲一级二级| 在线观看国产小视频| 青青草原国产免费| 国产无套在线观看| 狂野欧美性猛交xxxx乱大交| 日韩欧美国产免费播放| 中文字幕日韩精品有码视频| 久久人人爽人人| 日韩二区三区在线观看| 欧美性xxxx巨大黑人猛| 精品国产一区二区在线观看| 中文一区一区三区免费在线观看| 一区二区三区四区视频免费观看| 欧美最猛性xxxx高清| 日本高清不卡一区二区三区视频| 中文字幕在线网站| 午夜性爽视频男人的天堂| 亚洲第一综合网站| 亚洲欧洲在线免费| 九一国产精品| 中文字幕一区在线观看视频| 成人在线啊v| 欧美牲交a欧美牲交aⅴ免费真| 久久久久久久伊人| 日韩国产一二三区| 在线观看成人av电影| 在线伊人免费视频| 青娱乐国产91| 亚洲www永久成人夜色| 中文字幕 在线观看| 婷婷成人在线| 日本福利视频在线| 精品影片一区二区入口| 懂色一区二区三区| 日本xxx在线播放| 啪啪av大全导航福利综合导航| 亚洲国产精品一区二区三区| 欧美一区二区三区成人片在线| 亚洲精品人妻无码| 成人中文视频| 国产色无码精品视频国产| 99久在线精品99re8热| 国产丝袜一区视频在线观看| 国产一区二区精品调教| 国产一区二区三区在线| 欧美自拍小视频| 久久精品国产久精国产爱| 国产亚洲欧美另类中文| 亚洲va国产va欧美va观看| 成人免费视频视频在| 青青草成人影院| 秋霞影视一区二区三区| 成人av视屏| 九九九热精品免费视频观看网站| 亚洲小少妇裸体bbw| 在线观看国产91| bdsm在线观看播放视频| 日韩成人一级大片| 亚洲线精品一区二区三区| 亚洲欧美国产三级| 神马精品久久| 中文娱乐网av| 国产乱码精品一区二区三区精东| 亚洲系列在线观看| 亚洲国产综合在线看不卡| 伊人久久大香线蕉综合影院首页| 亚洲免费二区| 中日精品一色哟哟| 最新在线黄色网址| 波多野结衣作品集| 欧美福利视频| 国产精品久久久一区| 日本中文字幕免费观看| 久久综合国产精品台湾中文娱乐网| 日本aⅴ免费视频一区二区三区| 精品人妻无码一区二区三区蜜桃一| 国产午夜免费福利| 少妇精品无码一区二区| 久久久精品福利| 国产无遮挡一区二区三区毛片日本| 91网站观看| 天天色天天操综合| 综合五月婷婷| 中文字幕在线观看不卡视频| 精国产品一区二区三区a片| 日韩免费高清av| 91麻豆国产精品| 成人黄色大片网站| 日韩不卡视频在线观看| 精品视频在线观看日韩| 骚视频在线观看| 国产精品亚洲一区| 久久99影视| 青青草97国产精品免费观看无弹窗版| 成人性生交大片免费看中文网站| 911久久香蕉国产线看观看| 日韩欧美亚洲国产一区| 久久精品免费播放| 黄色亚洲在线| 爱爱永久免费视频| 麻豆av一区二区三区| 在线精品高清中文字幕| 中文在线a天堂| www.自拍偷拍| 97色成人综合网站| 五月天网站亚洲| 欧美精彩一区二区三区| 国内精品伊人久久久| 奇米视频7777| 午夜丝袜av电影| 亚洲第一综合色| 国产精品吴梦梦| 亚洲香蕉视频| 色天天综合狠狠色| 国产精彩视频在线| 白丝女仆被免费网站| 中文在线a在线| 成人免费网址在线| 国产精品 日产精品 欧美精品| 成人无码精品1区2区3区免费看| 国产女人18毛片水真多18精品| 久久精品波多野结衣| 蜜桃精品视频在线观看| 国产又粗又长又爽视频| 国产精品美女www| 初尝黑人巨炮波多野结衣电影| 久久狠狠亚洲综合| 一级特黄特色的免费大片| 天天干夜夜夜操| 国产精品麻豆一区二区| 无码人妻少妇色欲av一区二区| 在线国产91| 激情综合闲人网| 丁香天五香天堂综合| 精品久久久久久久久久中文字幕| 五月天婷婷影视| 日产乱码一卡二卡三免费| 国产精品入口麻豆| 午夜久久久精品| 狠狠操狠狠色综合网| 欧美一区二区三区在线观看免费| 国产亚洲精品久久| 久久久人成影片一区二区三区观看| 亚洲天堂免费在线观看视频| 中文字幕自拍偷拍| 97超级碰在线看视频免费在线看| 亚洲精品国产一区二区三区| 国产精品国产三级国产专播精品人| 五月激情综合色| 国产精品一卡二卡三卡| 在线视频一二区| 女人十八毛片嫩草av| 久久福利资源站| 西西裸体人体做爰大胆久久久| 图片区小说区国产精品视频| 亚洲成av人片在线观看www| heyzo在线观看| 国产精品一区二区资源| 成人午夜免费在线| 成熟了的熟妇毛茸茸| 欧美一级片免费播放| 性欧美xxxx大乳国产app| 久久久精品欧美| 一区二区三区.www| 麻豆蜜桃在线| 欧美日韩专区| 91福利在线免费观看| 青青草国产一区二区三区| 国产精品久久不卡| 亚洲免费视频成人| 人人妻人人澡人人爽精品日本| 日韩午夜影院| 欧美熟妇一区二区| 亚洲免费视频一区二区| 在线日韩第一页| 亚洲特级黄色片| 日本高清久久天堂| 亚洲美女久久| 日韩欧美三区| 色婷婷亚洲mv天堂mv在影片| 欧美第一页草草影院浮力| 欧美xxxx网站| 欧美性猛交xxxxbbb| 欧美日韩国产在线播放网站| 久久gogo国模啪啪裸体| 日韩综合一区二区| 国产中文字幕精品| 精品国偷自产在线视频99| 91精品国产99久久久久久红楼| 九九这里只精品视在线99| 日韩专区中文字幕一区二区| 国语对白精品一区二区| 国产综合久久久久久鬼色| 久久大香伊蕉在人线观看热2| 亚洲黄色影院| 搞黄网站免费观看| 在线视频se| 日韩av中文字幕在线播放| aa国产成人| 国产精品久线在线观看| 91激情在线视频| 国产成人高清| 天堂一区二区在线免费观看| 欧美日韩性生活片| 宅男午夜电影| 苍井空张开腿实干12次| 亚洲欧美日韩中文在线制服| 国产精品久久久久久久久久久久久久久| 亚洲成a人v欧美综合天堂下载| 国产精品一区二区av日韩在线| 97久久天天综合色天天综合色hd| 欧美三级在线观看视频| 鲁大师成人一区二区三区| 国产精品av电影| 欧类av怡春院| 色综合久久久888| 你懂的在线观看一区二区| 日韩精品综合一本久道在线视频| 亚洲女同一区| 国产丶欧美丶日本不卡视频| 亚洲一级一区| 伦理天堂电影| 伊人久久久久久久久| 亚洲国产精品欧美久久| 最新日韩在线视频| 青青草免费在线视频观看| 高潮久久久久久久久久久久久久| 一本久中文高清| 亚洲一区二区三区美女| 深夜成人在线观看| 精品无码久久久久久国产| av香蕉成人| 亚洲综合婷婷| 久久综合99re88久久爱| 国产精品69久久久久| 国产麻豆精品一区二区| 少妇高潮喷水在线观看| 欧美网站大全在线观看| 婷婷丁香激情五月| 欧美日韩一区二区三区在线看| 中文字幕视频在线免费欧美日韩综合在线看| 懂色av粉嫩av浪潮av| 久久国产一区二区三区| 久久久久久久香蕉网| 一级aaaa毛片| 国产成人综合在线视频| 国产精品影院在线观看| 国产免费人做人爱午夜视频| 成人在线中文字幕| av之家在线观看| 亚洲毛片网站| 国产精品久久久久久在线| 免费在线观看污视频| 天堂色在线视频| 少妇av片在线观看| 欧美一卡2卡3卡4卡无卡免费观看水多多| 欧美猛男gaygay网站| 国产女同一区二区| 无码国产69精品久久久久同性| 成人免费视频caoporn| 美女三级福利视频| 欧美日韩亚洲成人| 丝袜连裤袜欧美激情日韩| 亚洲字幕一区二区| 日韩和欧美的一区二区| 嫩草影院永久入口| 最近在线中文字幕| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 欧美极品美女视频网站在线观看免费| 日韩av电影天堂| 色综合久久久久| 高潮白浆女日韩av免费看| 香蕉视频在线观看免费| 久草免费在线观看视频| jizzjizz国产| 免费h在线看| av中文字幕免费| 日韩一区二区三区视频在线观看| 国产精品吊钟奶在线| 久久九九久精品国产免费直播| 亚洲高清视频在线| 久久久久97国产| 日韩在线免费观看av| 日韩精品久久久免费观看| 欧亚成年男女午夜| 国产乱码精品一区二区三区中文| 最新天堂在线视频| 欧美h版在线观看| 亚洲综合欧美在线|