青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

創(chuàng)建游戲內(nèi)核(24)【OO改良版】

 

本篇是創(chuàng)建游戲內(nèi)核(23)【OO改良版】的續(xù)篇,關(guān)于該內(nèi)核的細(xì)節(jié)說明請(qǐng)參閱創(chuàng)建游戲內(nèi)核(24)


接口:

//====================================================================================
// This class encapsulate server how to communicate with client.
//====================================================================================
typedef class NETWORK_SERVER
{
public:
    NETWORK_SERVER();
    
virtual ~NETWORK_SERVER();

    IDirectPlay8Server* get_server();

    BOOL init();
    BOOL shutdown();

    BOOL host(
const GUID* guid_adapter, long port, 
              
const char* session_name, const char* session_pwd, 
              
long max_players);

    BOOL disconnect();
    BOOL is_connected();

    BOOL send_data(DPNID player_id, 
void* data, ulong size, ulong flags);
    BOOL send_text(DPNID player_id, 
char* text, ulong flags);

    BOOL disconnect_player(
long player_id);

    BOOL get_ip(
char* player_ip, ulong player_id);
    BOOL get_player_name(
char* player_name, ulong player_id);
    
long get_port();
    BOOL get_session_name(
char* session_name);
    BOOL get_session_pwd(
char* session_pwd);
    
long get_max_players();
    
long get_cur_players_num();    

    
static HRESULT WINAPI network_msg_handler(PVOID user_context, DWORD msg_id, PVOID msg_buffer);

protected:   
    
virtual BOOL _add_player_to_group(DPNMSG_ADD_PLAYER_TO_GROUP* msg) { return TRUE; }
    
virtual BOOL _async_op_complete(DPNMSG_ASYNC_OP_COMPLETE* msg) { return TRUE; }
    
virtual BOOL _client_info(DPNMSG_CLIENT_INFO* msg) { return TRUE; }
    
virtual BOOL _connect_complete(DPNMSG_CONNECT_COMPLETE* msg) { return TRUE; }
    
virtual BOOL _create_group(DPNMSG_CREATE_GROUP* msg) { return TRUE; }
    
virtual BOOL _create_player(DPNMSG_CREATE_PLAYER* msg) { return TRUE; }
    
virtual BOOL _destroy_group(DPNMSG_DESTROY_GROUP* msg) { return TRUE; }
    
virtual BOOL _destroy_player(DPNMSG_DESTROY_PLAYER* msg) { return TRUE; }
    
virtual BOOL _enum_hosts_query(DPNMSG_ENUM_HOSTS_QUERY* msg) { return TRUE; }
    
virtual BOOL _enum_hosts_response(DPNMSG_ENUM_HOSTS_RESPONSE* msg) { return TRUE; }
    
virtual BOOL _group_info(DPNMSG_GROUP_INFO* msg) { return TRUE; }
    
virtual BOOL _host_migrate(DPNMSG_HOST_MIGRATE* msg) { return TRUE; }
    
virtual BOOL _indicate_connect(DPNMSG_INDICATE_CONNECT* msg) { return TRUE; }
    
virtual BOOL _indicated_connect_aborted(DPNMSG_INDICATED_CONNECT_ABORTED* msg) { return TRUE; }
    
virtual BOOL _peer_info(DPNMSG_PEER_INFO* msg) { return TRUE; }
    
virtual BOOL _receive(DPNMSG_RECEIVE* msg) { return TRUE; }
    
virtual BOOL _remove_player_from_group(DPNMSG_REMOVE_PLAYER_FROM_GROUP* msg) { return TRUE; }
    
virtual BOOL _return_buffer(DPNMSG_RETURN_BUFFER* msg) { return TRUE; }
    
virtual BOOL _send_complete(DPNMSG_SEND_COMPLETE* msg) { return TRUE; }
    
virtual BOOL _server_info(DPNMSG_SERVER_INFO* msg) { return TRUE; }
    
virtual BOOL _terminate_session(DPNMSG_TERMINATE_SESSION* msg) { return TRUE; }

protected:
    IDirectPlay8Server* m_server;
    BOOL                m_is_connected;
    
long                m_port;

    
char                m_session_name[MAX_PATH];
    
char                m_session_pwd[MAX_PATH];

    
long                m_max_players;
    
long                m_cur_players_num;    
} *NETWORK_SERVER_PTR;


實(shí)現(xiàn):

//---------------------------------------------------------------------------------
// Constructor, zero member data.
//---------------------------------------------------------------------------------
NETWORK_SERVER::NETWORK_SERVER()
{
    memset(
this, 0, sizeof(*this) - 4);
}

//---------------------------------------------------------------------------------
// Destructor, shutdown server.
//---------------------------------------------------------------------------------
NETWORK_SERVER::~NETWORK_SERVER()
{
    shutdown();
}

//---------------------------------------------------------------------------------
// Shutdown server.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::shutdown()
{
    
if(! disconnect())
        
return FALSE;

    m_server = NULL;
    
return TRUE;
}

//---------------------------------------------------------------------------------
// Disconnect server to all clients.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::disconnect()
{
    
if(m_server)
    {
        
// closes the open connection to a session
        if(FAILED(m_server->Close(0)))
            
return FALSE;
    }

    m_is_connected       = FALSE;
    m_port               = 0;
    m_session_name[0]    = NULL;
    m_session_pwd[0]     = NULL;
    m_max_players        = 0;
    m_cur_players_num    = 0;

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Return pointer to IDirectPlay8Server object.
//---------------------------------------------------------------------------------
IDirectPlay8Server* NETWORK_SERVER::get_server()
{
    
return m_server;
}

//---------------------------------------------------------------------------------
// Create IDirectPlay8Server object.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::init()
{
    
// shutdown old server object first
    shutdown();

    
// create the server object
    if(FAILED(CoCreateInstance(CLSID_DirectPlay8Server, NULL, CLSCTX_INPROC, IID_IDirectPlay8Server,
                               (
void**) &m_server)))
    {
        
return FALSE;
    }

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Host server.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::host(const GUID* guid_adapter, long port, 
                          
const char* session_name, const char* session_pwd, 
                          
long max_players)
{
    
// disconnect from current connection
    disconnect();

    m_port = port;

    
// error checking
    if(m_server == NULL || session_name == NULL || port == 0)
        
return FALSE;

    
// initialize the server object
    if(FAILED(m_server->Initialize((PVOID)this, network_msg_handler, 0)))
        
return FALSE;

    IDirectPlay8Address* _dp_address;

    
// create an address object
    if(FAILED(CoCreateInstance(CLSID_DirectPlay8Address, NULL, CLSCTX_INPROC, IID_IDirectPlay8Address,
                               (
void**) &_dp_address)))
        
return FALSE;

    DPN_APPLICATION_DESC _app_desc;
    WCHAR _w_session_name[MAX_PATH], _w_session_pwd[MAX_PATH];

    
// set protocol
    if(FAILED(_dp_address->SetSP(&CLSID_DP8SP_TCPIP)))
        
goto fail;

    
// set the port - must not be 0
    if(FAILED(_dp_address->AddComponent(DPNA_KEY_PORT, &m_port, sizeof(DWORD), DPNA_DATATYPE_DWORD)))
        
goto fail;

    
// set adapter (if any)
    if(guid_adapter)
    {
        
if(FAILED(_dp_address->AddComponent(DPNA_KEY_DEVICE, guid_adapter, sizeof(GUID), DPNA_DATATYPE_GUID)))
            
goto fail;
    }

    
// record the session name and password
    strcpy(m_session_name, session_name);
    mbstowcs(_w_session_name, session_name, MAX_PATH);

    
if(session_pwd)
    {
        strcpy(m_session_pwd, session_pwd);
        mbstowcs(_w_session_pwd, session_pwd, MAX_PATH);
    }

    
// setup the application description structure

    ZeroMemory(&_app_desc, 
sizeof(DPN_APPLICATION_DESC));

    _app_desc.dwSize          = 
sizeof(DPN_APPLICATION_DESC);
    _app_desc.dwFlags         = DPNSESSION_CLIENT_SERVER;
    _app_desc.guidApplication = g_app_guid;
    _app_desc.pwszSessionName = _w_session_name;

    
if(session_pwd)
    {
        _app_desc.pwszPassword = _w_session_pwd;
        _app_desc.dwFlags |= DPNSESSION_REQUIREPASSWORD;
    }

    m_max_players = max_players;

    _app_desc.dwMaxPlayers = max_players;

    
// start the hosting
    if(FAILED(m_server->Host(&_app_desc, &_dp_address, 1, NULL, NULL, NULL, 0)))
        
goto fail;

    _dp_address->Release();
    m_is_connected = TRUE;

    
return TRUE;

fail:
    _dp_address->Release();
    
return FALSE;
}

//---------------------------------------------------------------------------------
// Check whether server is hosting now.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::is_connected()
{
    
return m_is_connected;
}

//---------------------------------------------------------------------------------
// Send data to client.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::send_data(DPNID player_id, void* data, ulong size, ulong flags)
{
    
// error checking
    if(m_server == NULL || size == 0)
        
return FALSE;

    DPNHANDLE _async_handle;
    DPN_BUFFER_DESC _buf_desc;

    _buf_desc.dwBufferSize = size;
    _buf_desc.pBufferData  = (BYTE*) data;

    
if(FAILED(m_server->SendTo(player_id, &_buf_desc, 1, 0, NULL, &_async_handle, flags)))
        
return FALSE;

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Send string to client.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::send_text(DPNID player_id, char* text, ulong flags)
{
    
// error checking
    if(m_server == NULL || text == NULL)
        
return FALSE;

    
return send_data(player_id, text, (ulong)strlen(text)+1, flags);
}

//---------------------------------------------------------------------------------
// Disconnect specified player.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::disconnect_player(long player_id)
{
    
// error checking
    if(m_server == NULL)
        
return FALSE;

    
// try to disconnect the specified player
    if(FAILED(m_server->DestroyClient(player_id, NULL, 0, 0)))
        
return FALSE;

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Get ip address, include server and client ip address.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::get_ip(char* ip, ulong player_id)
{
    
// get host ip address if player_id == 0
    if(player_id == 0)
    {
        WSADATA _wsa_data;

        
// initiates use of ws2_32.dll by a process
        if(WSAStartup(MAKEWORD(1, 0), &_wsa_data))
            
return FALSE;

        
char _local_name[MAX_PATH];

        
// retrieves the standard host name for the local computer
        gethostname(_local_name, MAX_PATH);

        
// store information about a given host, such as host name, ip address, and so forth.
        HOSTENT* _host_ent;

        
// retrieves host information corresponding to a host name from a host database
        if((_host_ent = gethostbyname(_local_name)) == NULL)
        {
            
// terminates use of the ws2_32.dll
            WSACleanup();
            
return FALSE;
        }

        
// get localip
        char* _local_ip = inet_ntoa(*(in_addr*)_host_ent->h_addr_list[0]);

        WSACleanup();

        
if(_local_ip == NULL)
            
return FALSE;

        strcpy(ip, _local_ip);

        
return TRUE;
    }

    
if(m_server == NULL || !m_is_connected)
        
return FALSE;

    IDirectPlay8Address* _dp_address;

    
// retrieve the player information
    if(FAILED(m_server->GetClientAddress((DPNID)player_id, &_dp_address, 0)))
        
return FALSE;

    DWORD _size  = MAX_PATH;
    DWORD _flags = DPNA_DATATYPE_STRING;

    WCHAR _client_address[MAX_PATH];

    
// retrieves information on the component at the specified key
    if(FAILED(_dp_address->GetComponentByName(DPNA_KEY_HOSTNAME, _client_address, &_size, &_flags)))
    {
        _dp_address->Release();
        
return FALSE;
    }

    wcstombs(ip, _client_address, MAX_PATH);

    _dp_address->Release();
   
    
return TRUE;
}

//---------------------------------------------------------------------------------
// Get player name.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::get_player_name(char* player_name, ulong player_id)
{
    
if(m_server == NULL)
        
return FALSE;

    DPN_PLAYER_INFO* _player_info = NULL;
    DWORD _size = 0;

    
// retrieves the client information set for the specified client

    HRESULT _rv = m_server->GetClientInfo(player_id, _player_info, &_size, 0);

    
if(FAILED(_rv) && _rv != DPNERR_BUFFERTOOSMALL)
        
return FALSE;

    _player_info = (DPN_PLAYER_INFO*) 
new char[_size];
    _player_info->dwSize = 
sizeof(DPN_PLAYER_INFO);

    
if(FAILED(m_server->GetClientInfo(player_id, _player_info, &_size, 0)))
    {
        delete[] _player_info;
        
return FALSE;
    }

    wcstombs(player_name, _player_info->pwszName, MAX_PATH);
    delete[] _player_info;

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Return port of server.
//---------------------------------------------------------------------------------
long NETWORK_SERVER::get_port()
{
    
return m_port;
}

//---------------------------------------------------------------------------------
// Get session name.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::get_session_name(char* session_name)
{
    
if(session_name == NULL)
        
return FALSE;

    strcpy(session_name, m_session_name);
    
return TRUE;
}

//---------------------------------------------------------------------------------
// Get session password.
//---------------------------------------------------------------------------------
BOOL NETWORK_SERVER::get_session_pwd(char* session_pwd)
{
    
if(session_pwd == NULL)
        
return FALSE;

    strcpy(session_pwd, m_session_pwd);
    
return TRUE;
}

//---------------------------------------------------------------------------------
// Return max players permitted to login.
//---------------------------------------------------------------------------------
long NETWORK_SERVER::get_max_players()
{
    
return m_max_players;
}

//---------------------------------------------------------------------------------
// Return current player number.
//---------------------------------------------------------------------------------
long NETWORK_SERVER::get_cur_players_num()
{
    
return m_cur_players_num;
}

//---------------------------------------------------------------------------------
// Callback function to handler message for server.
//---------------------------------------------------------------------------------
HRESULT WINAPI NETWORK_SERVER::network_msg_handler(PVOID user_context, DWORD msg_id, PVOID msg_buffer)
{
    NETWORK_SERVER* _server;

    
if((_server = (NETWORK_SERVER*) user_context) == NULL)
        
return E_FAIL;

    
// pass message to user-defined function

    
switch(msg_id)
    {
    
case DPN_MSGID_ADD_PLAYER_TO_GROUP:
        
if(_server->_add_player_to_group((DPNMSG_ADD_PLAYER_TO_GROUP*) msg_buffer))
            
return S_OK;        
        
break;

    
case DPN_MSGID_ASYNC_OP_COMPLETE:
        
if(_server->_async_op_complete((DPNMSG_ASYNC_OP_COMPLETE*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_CLIENT_INFO:
        
if(_server->_client_info((DPNMSG_CLIENT_INFO*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_CONNECT_COMPLETE:
        
if(_server->_connect_complete((DPNMSG_CONNECT_COMPLETE*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_CREATE_GROUP:
        
if(_server->_create_group((DPNMSG_CREATE_GROUP*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_CREATE_PLAYER:
        
if(_server->_create_player((DPNMSG_CREATE_PLAYER*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_DESTROY_GROUP:
        
if(_server->_destroy_group((DPNMSG_DESTROY_GROUP*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_DESTROY_PLAYER:
        
if(_server->_destroy_player((DPNMSG_DESTROY_PLAYER*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_ENUM_HOSTS_QUERY:
        
if(_server->_enum_hosts_query((DPNMSG_ENUM_HOSTS_QUERY*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_ENUM_HOSTS_RESPONSE:
        
if(_server->_enum_hosts_response((DPNMSG_ENUM_HOSTS_RESPONSE*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_GROUP_INFO:
        
if(_server->_group_info((DPNMSG_GROUP_INFO*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_HOST_MIGRATE:
        
if(_server->_host_migrate((DPNMSG_HOST_MIGRATE*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_INDICATE_CONNECT:
        
if(_server->_indicate_connect((DPNMSG_INDICATE_CONNECT*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_INDICATED_CONNECT_ABORTED:
        
if(_server->_indicated_connect_aborted((DPNMSG_INDICATED_CONNECT_ABORTED*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_PEER_INFO:
        
if(_server->_peer_info((DPNMSG_PEER_INFO*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_RECEIVE:
        
if(_server->_receive((DPNMSG_RECEIVE*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_REMOVE_PLAYER_FROM_GROUP:
        
if(_server->_remove_player_from_group((DPNMSG_REMOVE_PLAYER_FROM_GROUP*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_RETURN_BUFFER:
        
if(_server->_return_buffer((DPNMSG_RETURN_BUFFER*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_SEND_COMPLETE:
        
if(_server->_send_complete((DPNMSG_SEND_COMPLETE*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_SERVER_INFO:
        
if(_server->_server_info((DPNMSG_SERVER_INFO*) msg_buffer))
            
return S_OK;
        
break;

    
case DPN_MSGID_TERMINATE_SESSION:
        
if(_server->_terminate_session((DPNMSG_TERMINATE_SESSION*) msg_buffer))
            
return S_OK;
        
break;
    }

    
return E_FAIL;
}

posted on 2007-10-14 18:01 lovedday 閱讀(308) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美剧在线观看| 欧美一区二区视频在线观看| 亚洲人成高清| 亚洲国产精品久久久久久女王| 欧美色网在线| 久久在精品线影院精品国产| 欧美美女视频| 欧美精品一区二区蜜臀亚洲| 亚洲国产成人久久综合| 黄色一区三区| 欧美一级淫片播放口| 亚洲午夜精品一区二区| 亚洲欧美激情精品一区二区| 亚洲欧洲av一区二区| 欧美女人交a| 欧美日韩视频在线第一区| 亚洲国产欧洲综合997久久| 欧美激情久久久久久| 亚洲第一区在线| 欧美日韩福利| 久久亚洲国产精品日日av夜夜| 亚洲一区二区三区精品视频| 欧美日韩国产在线播放网站| 国产精品激情电影| 玖玖国产精品视频| 亚洲一区二区三区久久| 欧美国产日韩一区二区三区| 亚洲免费av观看| 欧美岛国激情| 久久精品99国产精品日本| 亚洲欧洲日本国产| 国产欧美一区二区三区在线老狼| 蜜臀久久99精品久久久久久9| 亚洲精品免费在线| 久久狠狠亚洲综合| 亚洲精品视频一区| 亚洲高清视频在线观看| 午夜精品一区二区三区在线视| 一卡二卡3卡四卡高清精品视频| 美女久久一区| 亚洲国产精品成人| 欧美福利一区| 国产精品igao视频网网址不卡日韩| 欧美va亚洲va日韩∨a综合色| 在线成人小视频| 美日韩免费视频| 国产农村妇女毛片精品久久麻豆| 亚洲毛片一区二区| 亚洲欧洲精品成人久久奇米网| 久久成人免费日本黄色| 久久中文久久字幕| 久久亚洲欧美| 激情欧美一区| 亚洲第一福利在线观看| 美乳少妇欧美精品| 亚洲免费大片| 亚洲一区二区欧美| 国产精品亚洲综合天堂夜夜| 国产精品美女在线| 在线观看视频日韩| 亚洲国产精品悠悠久久琪琪| 欧美日韩精品三区| 亚洲一区美女视频在线观看免费| 亚洲一区三区在线观看| 中文亚洲免费| 久久国产精品亚洲va麻豆| 国内精品**久久毛片app| 日韩亚洲精品电影| 久热精品视频在线观看一区| 在线午夜精品自拍| 尤物在线精品| 日韩亚洲欧美一区| 国产真实久久| 一区二区日韩免费看| 精品动漫3d一区二区三区免费| 日韩视频精品在线| 狠色狠色综合久久| 久久久激情视频| 国产精品99久久久久久久久| 伊人春色精品| 久久这里只有| 欧美另类变人与禽xxxxx| 久久激五月天综合精品| 欧美系列一区| 亚洲一区二区三区免费在线观看| 亚洲国产精品免费| 亚洲欧美日韩在线播放| 欧美华人在线视频| 亚洲精品国产系列| 一区二区三区免费网站| 夜夜嗨av一区二区三区四季av| 欧美超级免费视 在线| 亚洲一区不卡| 国产精品久久福利| 亚洲欧美综合国产精品一区| 在线精品视频一区二区三四| 久久久久久穴| 欧美在线视频全部完| 国产欧美日韩免费| 欧美 日韩 国产 一区| 午夜精品福利视频| 美女图片一区二区| 一区二区三区成人精品| 欧美一级网站| 欧美黄色免费网站| 亚洲在线视频网站| 欧美黑人国产人伦爽爽爽| 亚洲裸体俱乐部裸体舞表演av| 欧美亚男人的天堂| 免播放器亚洲一区| 午夜国产精品视频免费体验区| 亚洲大黄网站| 久久精品一区二区三区不卡| 亚洲三级观看| 久久亚洲欧美| 香蕉av777xxx色综合一区| 亚洲激情成人| 亚洲影院色无极综合| 亚洲综合首页| 在线观看日韩| 欧美视频一区二区三区…| 欧美夜福利tv在线| 99在线热播精品免费99热| 美女视频一区免费观看| 亚洲欧美视频在线观看| 中文国产一区| 欧美日在线观看| 欧美成人中文字幕| 久久久久国产精品一区| 欧美一区在线视频| 亚洲国产精品久久91精品| 欧美在线二区| 国产美女扒开尿口久久久| 亚洲一区尤物| 亚洲欧美国产精品专区久久| 亚洲欧洲精品成人久久奇米网| 欧美国产综合| 亚洲图片激情小说| 亚洲欧美另类中文字幕| 久久精品免费电影| 99re成人精品视频| 99re66热这里只有精品3直播| 一区二区免费在线播放| 亚洲午夜国产成人av电影男同| 亚洲专区一区| 欧美日韩大片| 在线观看欧美日本| 亚洲字幕在线观看| 欧美成人免费一级人片100| 亚洲免费电影在线观看| 久久资源在线| 好看的日韩视频| 亚洲一区二区在线观看视频| 久久精品99无色码中文字幕| 女同性一区二区三区人了人一| 一区二区激情| 久久色在线播放| 欧美专区在线| 亚洲欧美99| 亚洲美女啪啪| 久久久久国色av免费看影院| 欧美丰满少妇xxxbbb| 国产主播在线一区| 亚洲免费一级电影| 亚洲视频一区在线观看| 欧美福利电影网| 日韩系列欧美系列| 亚洲激情午夜| 亚洲少妇自拍| 亚洲视频在线观看免费| 国产精品国产三级国产普通话99 | 99国产精品| 亚洲大片av| 欧美精品久久天天躁| 亚洲一区二区高清视频| 欧美一区二区三区日韩视频| 国产一区二区在线免费观看| 亚洲七七久久综合桃花剧情介绍| 麻豆av一区二区三区久久| 欧美成人乱码一区二区三区| 亚洲乱码国产乱码精品精98午夜| 亚洲国产小视频在线观看| 欧美女主播在线| 久久精品国产亚洲一区二区三区| 欧美一区二区三区喷汁尤物| 日韩亚洲一区二区| 欧美一区二区三区男人的天堂| 狠狠色丁香婷婷综合影院| 亚洲精品一区二区三区不| 国产情侣久久| 亚洲一区免费看| 亚洲美女中出| 男女av一区三区二区色多| 亚洲日本va在线观看| 午夜精品视频在线观看| 亚洲在线国产日韩欧美| 欧美成人激情视频免费观看| 久久久国产视频91| 国产一区二区精品| 欧美大片免费|