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

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

C++之WSAAsyncSelect模型實例

2020-01-26 15:13:23
字體:
來源:轉載
供稿:網友

本文實例講述了C++中WSAAsyncSelect模型的用法。分享給大家供大家參考。具體實現方法如下:

TCPServer.cpp源文件如下:

復制代碼 代碼如下:
#include "TCPServer.h" 
#include "resource.h" 
 
#define WM_SOCKET WM_USER+1 
 
CMyApp theApp; 
 
BOOL CMyApp::InitInstance() 

    //初始化套接字 
    WSADATA wsaData; 
    WORD wVersionRequested = MAKEWORD(2,0); 
    ::WSAStartup(wVersionRequested, &wsaData); 
    //顯示對話框 
    CMainDialog dlg; 
    m_pMainWnd = &dlg; 
    dlg.DoModal(); 
    //釋放套接字 
    ::WSACleanup(); 
    return FALSE; 

 
//CMainDialog 
CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAINDIALOG,pParentWnd) 

 

BEGIN_MESSAGE_MAP(CMainDialog, CDialog) 
ON_BN_CLICKED(IDC_START, OnStart) 
ON_BN_CLICKED(IDC_CLEAR, OnClear) 
ON_MESSAGE(WM_SOCKET, OnSocket) 
END_MESSAGE_MAP() 
 
void CMainDialog::OnCancel() 

    this->CloseAllSocket(); 
    CDialog::OnCancel(); 

 
BOOL CMainDialog::OnInitDialog() 

    CDialog::OnInitDialog(); 
 
    //設置圖標 
    SetIcon(theApp.LoadIconA(IDI_MAIN), FALSE); 
 
    //創建狀態欄并設置其屬性 
    m_bar.Create(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP, CRect(0,0,0,0), this, 101); 
    m_bar.SetBkColor(RGB(0xa6, 0xca, 0xfa)); 
    int arWidth[]={200,-1}; 
    m_bar.SetParts(2, arWidth); 
    m_bar.SetText("windows程序設計", 1, 0); 
    m_bar.SetText("空閑", 0, 0); 
    //關聯列表控件 
    m_listInfo.SubclassDlgItem(IDC_LIST, this); 
 
    //初始化套接字和連接列表 
    m_socket = INVALID_SOCKET; 
    m_nClient = 0; 
 
    //取得本機IP,在狀態欄中顯示 
    char szHostName[MAX_PATH] = {0}; 
    ::gethostname(szHostName, MAX_PATH); 
    hostent *pHost = gethostbyname(szHostName); 
    if (pHost != NULL) 
    { 
        CString strIP; 
        in_addr* addr = (in_addr*)*pHost->h_addr_list; 
        strIP.Format("本機IP:%s",inet_ntoa(addr[0])); 
        m_bar.SetText(strIP, 0, 0); 
    } 
    return TRUE; 

 
BOOL CMainDialog::CreateAndListen(int nPort) 

    if (m_socket == INVALID_SOCKET) 
    { 
        ::closesocket(m_socket); 
    } 
    //創建套接字 
    m_socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (m_socket == INVALID_SOCKET) 
    { 
        return FALSE; 
    } 
    //綁定端口 
    sockaddr_in sin; 
    sin.sin_family = AF_INET; 
    sin.sin_port = htons(nPort); 
    //sin.sin_addr.S_un.S_addr = INADDR_ANY; 
    sin.sin_addr.s_addr = INADDR_ANY; 
    int nErr = GetLastError(); 
    if (::bind(m_socket, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR) 
    { 
        nErr = GetLastError(); 
        return FALSE; 
    } 
    ::WSAAsyncSelect(m_socket, m_hWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE|FD_READ); 
 
    //進入監聽模式 
    ::listen(m_socket, 5); 
 
    return TRUE; 

 
BOOL CMainDialog::AddClient(SOCKET s) 

     
    if (m_nClient < MAX_SOCKET) 
    { 
        m_arClient[m_nClient++] = s; 
        return TRUE; 
    } 
    return FALSE; 
     

 
void CMainDialog::RemoveClient(SOCKET s) 

    BOOL bFound = FALSE; 
    int i; 
    for (i=0;i<m_nClient;i++) 
    { 
        if (m_arClient[i] == s) 
        { 
            bFound = TRUE; 
            break; 
        } 
    } 
 
    //找到 
    if (bFound) 
    { 
        m_nClient--; 
        for (int j=i;j<m_nClient;j++) 
        { 
            m_arClient[j] = m_arClient[j+1]; 
        } 
    } 

void CMainDialog::CloseAllSocket() 

    if (m_socket != INVALID_SOCKET) 
    { 
        ::closesocket(m_socket); 
        m_socket = INVALID_SOCKET; 
    } 
    for (int i=0;i<m_nClient;i++) 
    { 
        ::closesocket(m_arClient[i]); 
    } 
    m_nClient = 0; 

 
void CMainDialog::OnStart() 

    if (m_socket == INVALID_SOCKET) //開啟服務 
    { 
        CString strPort; 
        GetDlgItem(IDC_PORT)->GetWindowText(strPort); 
        int nPort = atoi(strPort); 
        if (nPort < 1 || nPort >65535) 
        { 
            MessageBox("port error"); 
            return; 
        } 
        //創建套接字 
        if (!this->CreateAndListen(nPort)) 
        { 
            MessageBox("create socket error"); 
            return; 
        } 
        //設置控件狀態 
        GetDlgItem(IDC_START)->SetWindowTextA("停止服務"); 
        m_bar.SetText("正在監聽...", 0, 0); 
        GetDlgItem(IDC_PORT)->EnableWindow(FALSE); 
    } 
    else //關閉服務 
    { 
        CloseAllSocket(); 
        GetDlgItem(IDC_START)->SetWindowTextA("開啟服務"); 
        m_bar.SetText("空閑", 0, 0); 
        GetDlgItem(IDC_PORT)->EnableWindow(TRUE); 
    } 
    return ; 

void CMainDialog::OnClear() 

    m_listInfo.ResetContent(); 
    return ; 

 
long CMainDialog::OnSocket(WPARAM wParam, LPARAM lParam) 

    //得到句柄  
    SOCKET s = wParam; 
    //查看是否出錯 
    if (WSAGETSELECTERROR(lParam)) 
    { 
        RemoveClient(s); 
        ::closesocket(s); 
        return 0; 
    } 
    //處理發生的事件 
    switch (WSAGETSELECTEVENT(lParam)) 
    { 
    case FD_ACCEPT: //監聽到有套接字中有連接進入 
        { 
            MessageBox("server:accept"); 
            if (m_nClient < MAX_SOCKET) 
            { 
                SOCKET client = ::accept(s, NULL, NULL); 
                this->AddClient(client); 
            } 
            else 
            { 
                MessageBox("too many connection"); 
            } 
        } 
        break; 
    case FD_CLOSE: 
        { 
            MessageBox("server:close"); 
            RemoveClient(s); 
            closesocket(s); 
        } 
        break; 
    case FD_READ: //接收到對方發來的數據包 
        { 
            MessageBox("server:read"); 
            //得到對方的地址 
            sockaddr_in sockAddr; 
            memset(&sockAddr, 0, sizeof(sockAddr)); 
            int nSockAddrLength = sizeof(sockAddr); 
            ::getpeername(s, (sockaddr*)&sockAddr, &nSockAddrLength); 
 
            int nPeerPort = ntohs(sockAddr.sin_port); 
            CString strIP = inet_ntoa(sockAddr.sin_addr);  // strIP 
 
            //獲得主機名稱 
            DWORD dwIP = ::inet_addr(strIP); 
            hostent* pHost = ::gethostbyaddr((LPSTR)&dwIP, 4, AF_INET); 
            char szHostName[256]={0}; 
            strncpy(szHostName, pHost->h_name, 256); 
 
            //得到網絡數據 
            char szContent[1024]={0}; 
            ::recv(s, szContent, 1024, 0); 
 
            //顯示 
            CString strItem = CString(szHostName) + "[" + strIP + "]:" + CString(szContent); 
            m_listInfo.InsertString(0, strItem); 
        } 
        break; 
    } 
    return 0; 
}

TCPServer.h頭文件如下:

復制代碼 代碼如下:
#include <afxwin.h> 
#include <afxext.h>  //CStatusBar 
#include <WinSock2.h> 
#include <afxcmn.h> 
 
#pragma comment(lib, "WS2_32.lib") 
#define  MAX_SOCKET 56 //最大客戶量 
 
class CMyApp:public  CWinApp 

public: 
    BOOL InitInstance(); 
}; 
 
//CMainDialog 
class CMainDialog:public CDialog 

public: 
    CMainDialog(CWnd* pParentWnd=NULL); 
 
protected: 
    virtual BOOL OnInitDialog(); 
    virtual void OnCancel(); 
    //開啟或停止服務 
    afx_msg void OnStart(); 
    afx_msg void OnClear(); 
    afx_msg long OnSocket(WPARAM wParam, LPARAM lParam); 
 
    BOOL CreateAndListen(int nPort); 
 
    //向客戶連接列表中加一個客戶 
    BOOL AddClient(SOCKET s); 
    //從客戶連接列表中移除一個客戶 
    void RemoveClient(SOCKET s); 
    //關閉所有連接 
    void CloseAllSocket(); 
 
protected: 
    SOCKET m_socket; 
    //兩個子窗口控件 
    CListBox m_listInfo; 
    CStatusBarCtrl m_bar; 
 
    //客戶連接列表 
    SOCKET m_arClient[MAX_SOCKET]; //套接字列表 
    int m_nClient; //上述數組的大小 
 
    DECLARE_MESSAGE_MAP() 
};

TCPClient.cpp源文件如下:

復制代碼 代碼如下:
#include "TCPClient.h" 
#include "resource.h" 
 
#define WM_SOCKET WM_USER+1 
 
CMyApp theApp; 
 
BOOL CMyApp::InitInstance() 

    //初始化套接字 
    WSADATA wsaData; 
    WORD wVersionRequested = MAKEWORD(2,0); 
    ::WSAStartup(wVersionRequested, &wsaData); 
    //顯示對話框 
    CMainDialog dlg; 
    m_pMainWnd = &dlg; 
    dlg.DoModal(); 
    //釋放套接字 
    ::WSACleanup(); 
    return FALSE; 

 
//CMainDialog 
CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAINDIALOG,pParentWnd) 

 

BEGIN_MESSAGE_MAP(CMainDialog, CDialog) 
    ON_BN_CLICKED(IDC_CONNECT, OnConnect) 
    ON_BN_CLICKED(IDC_SEND, OnSend) 
    ON_MESSAGE(WM_SOCKET, OnSocket) 
END_MESSAGE_MAP() 
 
void CMainDialog::OnCancel() 

     
    CDialog::OnCancel(); 

 
BOOL CMainDialog::OnInitDialog() 

    CDialog::OnInitDialog(); 
 
    //設置圖標 
    SetIcon(theApp.LoadIconA(IDI_MAIN), FALSE); 
 
    //關聯控件 
    m_edit_text.SubclassDlgItem(IDC_EDIT_CONTENT, this); 
    //狀態欄 
    m_bar.Create(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP, CRect(0, 0, 0,0), this, NULL); 
    int nWidth[]={100,-1}; 
    m_bar.SetParts(2, nWidth); 
    m_bar.SetText("windows程序設計", 1, 0); 
    m_bar.SetText("空閑", 0, 0); 
 
    GetDlgItem(IDC_ADDR)->SetWindowTextA("192.168.19.143"); 
    GetDlgItem(IDC_PORT)->SetWindowTextA("9999"); 
 
    // 
    m_socket = INVALID_SOCKET; 
     
    return TRUE; 

void CMainDialog::AddStringToList(CString strText) 

    CString strContent; 
    GetDlgItem(IDC_EDIT_CONTENT)->GetWindowText(strContent); 
    GetDlgItem(IDC_EDIT_CONTENT)->SetWindowText(strContent+strText); 
 

long CMainDialog::OnSocket(WPARAM wParam, LPARAM lParam) 

    SOCKET  s = wParam; 
    if (WSAGETSELECTERROR(lParam)) 
    { 
        ::closesocket(m_socket); 
        m_socket = INVALID_SOCKET; 
        return 0; 
    } 
    switch (WSAGETSELECTEVENT(lParam)) 
    { 
    case FD_READ: 
        { 
            MessageBox("client:read"); 
            char szText[1024]={0}; 
            ::recv(s, szText, 1024, 0); 
            AddStringToList(CString(szText)+"/r/n"); 
        } 
        break; 
    case FD_CONNECT: 
        { 
            MessageBox("client:connect"); 
            GetDlgItem(IDC_CONNECT)->SetWindowTextA("斷開連接"); 
            GetDlgItem(IDC_ADDR)->EnableWindow(FALSE); 
            GetDlgItem(IDC_PORT)->EnableWindow(FALSE); 
            GetDlgItem(IDC_TEXT)->EnableWindow(TRUE); 
            GetDlgItem(IDC_SEND)->EnableWindow(TRUE); 
            m_bar.SetText("已經連接到服務器", 0, 0); 
        } 
        break; 
    case FD_CLOSE: 
        { 
            MessageBox("client:close"); 
            OnConnect(); 
        } 
        break; 
    } 
    return 0; 

 
BOOL CMainDialog::Connect(LPCTSTR pszRemoteAddr, u_short nPort) 

    //創建套接字 
    m_socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (INVALID_SOCKET == m_socket) 
    { 
        return FALSE; 
    } 
    ::WSAAsyncSelect(m_socket, m_hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE); 
 
    ULONG uAddr = ::inet_addr(pszRemoteAddr); 
    if (uAddr == INADDR_NONE) 
    { 
        //不是IP地址,就認為是主機名稱 
        //從主機名得到IP 
        hostent* pHost = ::gethostbyname(pszRemoteAddr); 
        if (pHost == NULL) 
        { 
            ::closesocket(m_socket); 
            m_socket = INVALID_SOCKET; 
            return FALSE; 
        } 
        uAddr = ((struct in_addr*)*(pHost->h_addr_list))->s_addr; 
    } 
 
    //填寫服務器信息 
    sockaddr_in remote; 
    remote.sin_family = AF_INET; 
    remote.sin_addr.S_un.S_addr = uAddr; 
    remote.sin_port = ::htons(nPort); 
    //連接 
    ::connect(m_socket, (sockaddr*)&remote, sizeof(sockaddr)); 
    return TRUE; 

 
void CMainDialog::OnConnect() 

    if (INVALID_SOCKET == m_socket) //連接服務器 
    { 
        CString strAddr; 
        GetDlgItem(IDC_ADDR)->GetWindowText(strAddr); 
        if (strAddr.IsEmpty()) 
        { 
            MessageBox("the servers IP is empty"); 
            return; 
        } 
        CString strPort; 
        GetDlgItem(IDC_PORT)->GetWindowTextA(strPort); 
        int nPort = atoi(strPort); 
        if (nPort < 1 || nPort > 65535) 
        { 
            MessageBox("port error"); 
            return; 
        } 
        if (Connect(strAddr, nPort) == FALSE) 
        { 
            MessageBox("connect to servers error..."); 
            return; 
        } 
        //設置用戶界面 
        GetDlgItem(IDC_CONNECT)->SetWindowText("取消"); 
        m_bar.SetText("正在連接..", 0, 0); 
         
    } 
    else //斷開服務器 
    { 
        ::closesocket(m_socket); 
        m_socket = INVALID_SOCKET; 
        //設置用戶界面 
        GetDlgItem(IDC_CONNECT)->SetWindowTextA("連接服務器"); 
        m_bar.SetText("空閑", 0, 0); 
        GetDlgItem(IDC_ADDR)->EnableWindow(TRUE); 
        GetDlgItem(IDC_PORT)->EnableWindow(TRUE); 
        GetDlgItem(IDC_SEND)->EnableWindow(FALSE); 
        GetDlgItem(IDC_TEXT)->EnableWindow(FALSE); 
    } 
     
    //this->Connect(szAddr, ) 

void CMainDialog::OnSend() 

    CString strSendContent; 
    GetDlgItem(IDC_TEXT)->GetWindowTextA(strSendContent); 
    ::send(m_socket, strSendContent, strSendContent.GetLength(), 0); 
    GetDlgItem(IDC_TEXT)->SetWindowTextA(""); 
}

TCPClient.h頭文件如下:

復制代碼 代碼如下:
#include <afxwin.h> 
#include <afxext.h>  //CStatusBar 
#include <WinSock2.h> 
#include <afxcmn.h> 
 
#pragma comment(lib, "WS2_32.lib") 
#define  MAX_SOCKET 56 //最大客戶量 
 
class CMyApp:public  CWinApp 

public: 
    BOOL InitInstance(); 
}; 
 
 
//CMainDialog 
class CMainDialog:public CDialog 

public: 
    CMainDialog(CWnd* pParentWnd=NULL); 
 
protected: 
    virtual BOOL OnInitDialog(); 
    virtual void OnCancel(); 
    ////開啟或停止服務 
    //afx_msg void OnStart(); 
    afx_msg void OnSend(); 
    afx_msg long OnSocket(WPARAM wParam, LPARAM lParam); 
    void OnConnect(); 
 
    BOOL Connect(LPCTSTR pszRemoteAddr, u_short nPort); 
    SOCKET m_socket; 
 
    // 控件 
    CStatusBarCtrl m_bar; 
    CEdit m_edit_text; 
 
    void AddStringToList(CString strText); 
    //BOOL CreateAndListen(int nPort); 
 
    ////向客戶連接列表中加一個客戶 
    //BOOL AddClient(SOCKET s); 
    ////從客戶連接列表中移除一個客戶 
    //void RemoveClient(SOCKET s); 
    ////關閉所有連接 
    //void CloseAllSocket(); 
 
 
    DECLARE_MESSAGE_MAP() 
};

希望本文所述對大家的C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩欧美精品在线观看| 亚洲天堂2020| 97国产精品视频人人做人人爱| 懂色aⅴ精品一区二区三区蜜月| 精品国偷自产在线| 欧美—级高清免费播放| 久久国产天堂福利天堂| 57pao国产成人免费| 亚洲女人天堂成人av在线| 色天天综合狠狠色| 国产精品一区二区电影| 欧美主播福利视频| 亚洲人精选亚洲人成在线| 在线观看日韩视频| 国产精品美乳在线观看| 韩日精品中文字幕| 日韩在线观看视频免费| 日韩中文娱乐网| 清纯唯美日韩制服另类| 456国产精品| 在线看日韩欧美| 国产精品精品一区二区三区午夜版| 日韩美女视频免费在线观看| 国产精品老女人精品视频| 最好看的2019的中文字幕视频| 国产日本欧美一区二区三区| 色先锋久久影院av| 日韩亚洲精品视频| 中文字幕亚洲一区| 亚洲第一天堂av| 中文字幕久久久av一区| 欧美高清一级大片| 91精品在线一区| 久久精品免费播放| 亚洲bt欧美bt日本bt| 91亚洲精品在线| 色偷偷av亚洲男人的天堂| 在线亚洲欧美视频| 欧美激情在线有限公司| 亚洲人成网站777色婷婷| 国产福利视频一区二区| 久久精品成人动漫| 亚洲精品99999| 最近2019中文字幕在线高清| 欧美大片免费观看在线观看网站推荐| 日韩美女视频免费在线观看| 福利精品视频在线| 欧美亚洲一级片| 日韩hd视频在线观看| 国产精品看片资源| 色婷婷**av毛片一区| 欧美激情乱人伦一区| 国产日产欧美a一级在线| 中文字幕亚洲欧美在线| 清纯唯美亚洲激情| 久久91亚洲人成电影网站| 亚洲欧美一区二区三区在线| 久久精品亚洲一区| 国产精品91久久久| 欧洲亚洲女同hd| 亚洲精品中文字幕av| 国产在线观看一区二区三区| 91高清视频免费| 久久精品电影网| 91美女片黄在线观| 一区二区福利视频| 黄色一区二区在线观看| 久久天天躁狠狠躁夜夜av| 午夜精品国产精品大乳美女| 亚洲加勒比久久88色综合| 国产精品免费久久久久久| 欧美激情一区二区三区高清视频| 久久精品国产96久久久香蕉| 国产精品wwwwww| 日韩亚洲第一页| 在线视频中文亚洲| 亚洲自拍在线观看| 久久av红桃一区二区小说| 精品中文字幕在线观看| 91av网站在线播放| 国产精品久久久久91| 国产性猛交xxxx免费看久久| 国产欧美日韩亚洲精品| 成人欧美一区二区三区黑人孕妇| 欧美成人中文字幕| 欧美伦理91i| 久久国产精品久久国产精品| 久久久国产精品x99av| 中文字幕日韩欧美在线视频| 亚洲剧情一区二区| 久久久综合免费视频| 亚洲欧美在线第一页| 中文字幕日韩欧美精品在线观看| 91网站在线免费观看| 国产成人在线一区| 人人澡人人澡人人看欧美| 欧美激情亚洲另类| 国模精品一区二区三区色天香| 久久精视频免费在线久久完整在线看| 国产在线视频91| 亚洲精品一区av在线播放| 亚洲视屏在线播放| 亚洲精品视频播放| 亚洲男人的天堂网站| 5278欧美一区二区三区| 欧美一区二区.| 热99精品只有里视频精品| 欧美成人自拍视频| 日本高清视频精品| 亚洲人成电影网站色xx| 国语自产精品视频在线看| 国产精品9999| 国产精品尤物福利片在线观看| 亚洲香蕉伊综合在人在线视看| 欧美一级淫片aaaaaaa视频| 最近2019中文字幕第三页视频| 黑人狂躁日本妞一区二区三区| 欧美最猛黑人xxxx黑人猛叫黄| 美女视频久久黄| 欧美日本在线视频中文字字幕| 久久99精品久久久久久青青91| 色婷婷综合久久久久中文字幕1| 国产精品久久久久久久久借妻| 日韩电视剧在线观看免费网站| 久久视频免费观看| 欧美午夜丰满在线18影院| 精品国内产的精品视频在线观看| 国产精品成久久久久三级| 不卡伊人av在线播放| 久久亚洲电影天堂| 91精品久久久久久久久久| 国产精品久久久久77777| 久久视频在线播放| 国产高清视频一区三区| 亚洲图片在线综合| 久久精品视频在线观看| 亚洲精品视频播放| 日韩成人激情影院| 亚洲国产天堂久久综合网| 中文字幕日韩高清| 国产免费一区二区三区在线观看| 国产综合在线看| 国产精品成人久久久久| 尤物九九久久国产精品的分类| 亚洲xxxx在线| 欧美综合一区第一页| 亚洲加勒比久久88色综合| 国产精品美女无圣光视频| 岛国精品视频在线播放| 欧美日韩国产在线播放| 欧美日韩中文字幕日韩欧美| 欧美极品xxxx| 国产精品国产三级国产专播精品人| 日韩亚洲精品电影| 欧美日韩国产va另类| 国产精品一区二区三区免费视频| 亚洲在线视频观看| 欧美激情第一页xxx| 操日韩av在线电影| 国产一区二区三区精品久久久| 国模精品一区二区三区色天香| 精品国产区一区二区三区在线观看| 最近2019中文字幕mv免费看| 亚洲在线第一页|