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

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

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

 

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


接口:

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

    IDirectPlay8Client* get_client();

    BOOL init();
    BOOL shutdown();

    BOOL connnect(
const GUID* guid_adapter, 
                  
const char* server_ip, long server_port, 
                  
const char* player_name,
                  
const char* session_name, const char* session_pwd);

    BOOL disconnect();
    BOOL is_connected();

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

    BOOL get_local_ip(
char* local_ip);
    
long get_server_port();
    BOOL get_name(
char* name);
    BOOL get_session_name(
char* session_name);
    BOOL get_session_pwd(
char* session_pwd);

    
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:
    IDirectPlay8Client* m_client;

    BOOL                m_is_connected;

    
char                m_server_ip[MAX_PATH];
    
long                m_server_port;

    
char                m_name[MAX_PATH];

    
char                m_session_name[MAX_PATH];
    
char                m_session_pwd[MAX_PATH];    
} *NETWORK_CLIENT_PTR;

實現(xiàn):
//---------------------------------------------------------------------------------
// Constructor, zero member data.
//---------------------------------------------------------------------------------
NETWORK_CLIENT::NETWORK_CLIENT()
{
    memset(
this, 0, sizeof(*this)-4);
}

//---------------------------------------------------------------------------------
// Destructor, shutdown this client connection.
//---------------------------------------------------------------------------------
NETWORK_CLIENT::~NETWORK_CLIENT()
{
    shutdown();
}

//---------------------------------------------------------------------------------
// Shutdown this client connection.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::shutdown()
{
    
if(! disconnect())
        
return FALSE;

    m_client = NULL;
    
return TRUE;
}

//---------------------------------------------------------------------------------
// Disconnet this client to any clients and servers.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::disconnect()
{
    
if(m_client)
    {
        
if(FAILED(m_client->Close(0)))
            
return FALSE;
    }
    
    m_is_connected    = FALSE;
    m_server_port     = 0;
    m_server_ip[0]    = 0;
    m_name[0]         = 0;
    m_session_name[0] = 0;
    m_session_pwd[0]  = 0;

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Return pointer to DirectPlay client object.
//---------------------------------------------------------------------------------
IDirectPlay8Client* NETWORK_CLIENT::get_client()
{
    
return m_client;
}

//---------------------------------------------------------------------------------
// Create DirectPlay client object.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::init()
{
    
// shutdown older connection first
    shutdown();

    
// create the client object
    if(FAILED(CoCreateInstance(CLSID_DirectPlay8Client, NULL, CLSCTX_INPROC, IID_IDirectPlay8Client,
                               (
void**) &m_client)))
        
return FALSE;

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Connect to server.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::connnect(const GUID* guid_adapter, 
                              
const char* server_ip, long server_port, 
                              
const char* player_name, 
                              
const char* session_name, const char* session_pwd)
{
    
// disconnnect older connection first
    disconnect();

    
// error checking
    if(m_client == NULL || session_name == NULL || player_name == NULL || server_ip == NULL)
        
return FALSE;

    
if((m_server_port = server_port) == 0)
        
return FALSE;

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

    
// assign client information

    DPN_PLAYER_INFO _player_info;
    WCHAR _w_player_name[MAX_PATH];

    ZeroMemory(&_player_info, 
sizeof(DPN_PLAYER_INFO));

    mbstowcs(_w_player_name, player_name, strlen(player_name)+1);

    _player_info.dwSize      = 
sizeof(DPN_PLAYER_INFO);
    _player_info.dwInfoFlags = DPNINFO_NAME | DPNINFO_DATA;
    _player_info.pwszName    = _w_player_name;

    m_client->SetClientInfo(&_player_info, NULL, NULL, DPNSETCLIENTINFO_SYNC);

    
// create address objects

    IDirectPlay8Address* _dp_address = NULL;
    IDirectPlay8Address* _dp_device  = NULL;

    
if(FAILED(CoCreateInstance(CLSID_DirectPlay8Address, NULL, CLSCTX_INPROC, IID_IDirectPlay8Address,
                               (
void**) &_dp_address)))
        
return FALSE;

    
if(FAILED(CoCreateInstance(CLSID_DirectPlay8Address, NULL, CLSCTX_INPROC, IID_IDirectPlay8Address,
                               (
void**) &_dp_device)))
    {
        _dp_address->Release();
        
return FALSE;
    }

    
// set protocols
    _dp_address->SetSP(&CLSID_DP8SP_TCPIP);
    _dp_device->SetSP(&CLSID_DP8SP_TCPIP);

    
// set the port - must not be 0
    _dp_address->AddComponent(DPNA_KEY_PORT, &m_server_port, sizeof(DWORD), DPNA_DATATYPE_DWORD);    

    WCHAR _w_server_ip[MAX_PATH];

    
// set the host ip address
    mbstowcs(_w_server_ip, server_ip, strlen(server_ip)+1);
    _dp_address->AddComponent(DPNA_KEY_HOSTNAME, _w_server_ip, (DWORD) ((wcslen(_w_server_ip) + 1) * 
sizeof(WCHAR)),
                             DPNA_DATATYPE_STRING);

    
// set the adapter
    _dp_address->AddComponent(DPNA_KEY_DEVICE, guid_adapter, sizeof(GUID), DPNA_DATATYPE_GUID);
    _dp_device->AddComponent(DPNA_KEY_DEVICE, guid_adapter, 
sizeof(GUID), DPNA_DATATYPE_GUID);

    WCHAR _w_session_name[MAX_PATH], _w_session_pwd[MAX_PATH];

    
// 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

    DPN_APPLICATION_DESC _app_desc;

    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;
    }

    DPNHANDLE _async_handle;

    BOOL _ret_value = TRUE;

    
// connect to server    
    HRESULT _rv = m_client->Connect(&_app_desc, _dp_address, _dp_device, NULL, NULL, NULL, 0, NULL, &_async_handle, 0);

    
if(FAILED(_rv))
    {
        _ret_value = FALSE;

        
if(_rv == DPNERR_HOSTREJECTEDCONNECTION)
            err_msg_box("Host reject connection.");
        
else if(_rv == DPNERR_INVALIDAPPLICATION)
            err_msg_box("The GUID supplied for the application is invalid.");
        
else if(_rv == DPNERR_INVALIDDEVICEADDRESS)
            err_msg_box("The address for the local computer or adapter is invalid.");
        
else if(_rv == DPNERR_INVALIDFLAGS)
            err_msg_box("The flags passed to this method are invalid.");
        
else if(_rv == DPNERR_INVALIDHOSTADDRESS)
            err_msg_box("The specified remote address is invalid.");
        
else if(_rv == DPNERR_INVALIDINSTANCE)
            err_msg_box("The GUID for the application instance is invalid.");
        
else if(_rv == DPNERR_INVALIDINTERFACE)
            err_msg_box("The interface parameter is invalid. This value will be returned in a connect request"
            " if the connecting player was not a client in a client/server game or a peer in a peer-to-peer game.");
        
else if(_rv == DPNERR_INVALIDPASSWORD)        
            err_msg_box("An invalid password was supplied when attempting to join a session that requires a password.");
        
else if(_rv == DPNERR_NOCONNECTION)
            err_msg_box("No communication link was established.");
        
else if(_rv == DPNERR_NOTHOST)
            err_msg_box("An attempt by the client to connect to a nonhost computer.");
        
else if(_rv == DPNERR_SESSIONFULL)
            err_msg_box("The maximum number of players allotted for the session has been reached.");
        
else if(_rv == DPNERR_ALREADYCONNECTED)
            err_msg_box("The object is already connected to the session.");
    }   
    
    _dp_address->Release();
    _dp_device->Release();
    
return _ret_value;
}

//---------------------------------------------------------------------------------
// Judge whether client has connected to server.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::is_connected()
{
    
return m_is_connected;
}

//---------------------------------------------------------------------------------
// Send data to server.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::send_data(void* data, ulong size, ulong flags)
{
    
// error checking
    if(m_client == NULL)
        
return FALSE;

    
// build a data structure

    DPN_BUFFER_DESC _buffer_desc;

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

    DPNHANDLE _async_handle;

    
if(FAILED(m_client->Send(&_buffer_desc, 1, 0, NULL, &_async_handle, flags)))
        
return FALSE;

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Send text to server.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::send_text(char* text, ulong flags)
{
    
// error checking
    if(m_client == NULL || text == NULL)
        
return FALSE;

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

//---------------------------------------------------------------------------------
// Get local ip address.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::get_local_ip(char* local_ip)
{
    WSADATA _wsa_data;

    
if(WSAStartup(MAKEWORD(1, 0), &_wsa_data))
        
return FALSE;

    
char _local_name[MAX_PATH];
    gethostname(_local_name, MAX_PATH);

    HOSTENT* _host_ent;

    
if((_host_ent = gethostbyname(_local_name)) == NULL)
    {
        WSACleanup();
        
return FALSE;
    }

    
char* _ip_addr = inet_ntoa(*((in_addr*) _host_ent->h_addr_list[0]));
    
    WSACleanup();

    
if(_ip_addr == NULL)
        
return FALSE;

    strcpy(local_ip, _ip_addr);

    
return TRUE;
}

//---------------------------------------------------------------------------------
// Return port which used to connect to server.
//---------------------------------------------------------------------------------
long NETWORK_CLIENT::get_server_port()
{
    
return m_server_port;
}


//---------------------------------------------------------------------------------
// Return name.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::get_name(char* name)
{
    
if(name == NULL)
        
return FALSE;

    strcpy(name, m_name);
    
return TRUE;
}

//---------------------------------------------------------------------------------
// Get session name.
//---------------------------------------------------------------------------------
BOOL NETWORK_CLIENT::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_CLIENT::get_session_pwd(char* session_pwd)
{
    
if(session_pwd == NULL)
        
return FALSE;

    strcpy(session_pwd, m_session_pwd);
    
return TRUE;
}

//---------------------------------------------------------------------------------
// Message handler.
//---------------------------------------------------------------------------------
HRESULT WINAPI NETWORK_CLIENT::network_msg_handler(PVOID user_context, DWORD msg_id, PVOID msg_buffer)
{
    NETWORK_CLIENT_PTR _client;
    DPNMSG_CONNECT_COMPLETE* _msg_connect_complte;

    
if((_client = (NETWORK_CLIENT_PTR) user_context) == NULL)
        
return E_FAIL;

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

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

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

    
case DPN_MSGID_CONNECT_COMPLETE:
        
// update connection information

        _msg_connect_complte = (DPNMSG_CONNECT_COMPLETE*) msg_buffer;

        
if(_msg_connect_complte->hResultCode == S_OK)
            _client->m_is_connected = TRUE;

        
if(_client->_connect_complete((DPNMSG_CONNECT_COMPLETE*) msg_buffer))
            
return S_OK;

        
break;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
case DPN_MSGID_TERMINATE_SESSION:
      _client->m_is_connected = FALSE;
      
if(_client->_terminate_session((DPNMSG_TERMINATE_SESSION*) msg_buffer))
        
return S_OK;
      
break;
    }

    
return E_FAIL;
}

posted on 2007-10-14 18:09 lovedday 閱讀(356) 評論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美激情导航| 国产亚洲激情| 亚洲最新在线视频| 亚洲国产精品久久人人爱蜜臀| 久久午夜精品一区二区| 久久综合影视| 亚洲国产精品久久91精品| 亚洲黄色免费网站| 99精品国产一区二区青青牛奶| 一区二区三区 在线观看视| 一区二区欧美视频| 久久久在线视频| 欧美日韩专区| 亚洲成人原创| 亚洲一区视频| 欧美刺激性大交免费视频| 日韩亚洲欧美成人| 久久精品99国产精品酒店日本| 欧美a级大片| 国产无一区二区| 亚洲麻豆视频| 久久免费高清| 亚洲视频专区在线| 免费影视亚洲| 国产综合视频| 亚洲午夜电影网| 牛牛精品成人免费视频| 亚洲视频在线免费观看| 免费成人性网站| 国产一二三精品| 亚洲色在线视频| 亚洲成色777777在线观看影院| 亚洲欧美怡红院| 欧美日本簧片| 亚洲日本精品国产第一区| 久久精品五月婷婷| 亚洲视频狠狠| 欧美日韩一区二区国产| 亚洲精品国产精品国自产观看| 久久精品综合| 午夜精品一区二区三区在线| 欧美色综合天天久久综合精品| 亚洲国产精品福利| 美女福利精品视频| 久久国产精品网站| 国产色产综合色产在线视频| 亚洲制服少妇| 一区二区三区久久久| 欧美精品久久久久久久免费观看 | 亚洲国产精品黑人久久久| 性视频1819p久久| 一本色道久久88综合亚洲精品ⅰ | 亚洲区中文字幕| 久久午夜av| 在线观看欧美一区| 久久亚洲免费| 久久久91精品国产一区二区三区 | 亚洲在线国产日韩欧美| 亚洲三级电影全部在线观看高清| 蜜臀av一级做a爰片久久| 在线观看中文字幕不卡| 美女国产精品| 蜜臀av一级做a爰片久久| 最新日韩av| 91久久久久久久久| 欧美大胆成人| 亚洲日韩欧美一区二区在线| 欧美成人dvd在线视频| 久久综合激情| 亚洲精选一区二区| 一区二区精品在线| 国产精品日韩| 久久伊人精品天天| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲日本成人女熟在线观看| 91久久精品www人人做人人爽| 欧美精品一区二区在线观看| 日韩视频三区| 亚洲影视综合| 一区二区三区中文在线观看| 欧美成人免费大片| 欧美国产激情二区三区| 亚洲一区二区三区午夜| 欧美一进一出视频| 亚洲国产老妈| 亚洲一本大道在线| 1204国产成人精品视频| 亚洲经典三级| 国产日韩免费| 最新国产の精品合集bt伙计| 国产精品久久中文| 欧美成人精品一区二区三区| 欧美日韩一卡二卡| 老色鬼精品视频在线观看播放| 欧美二区视频| 欧美在线观看视频一区二区| 免费一区视频| 久久精品久久综合| 欧美精品激情在线观看| 久久久国产一区二区| 欧美女激情福利| 久久亚洲欧洲| 国产欧美一区二区视频| 亚洲乱码国产乱码精品精 | 黄网站色欧美视频| 妖精成人www高清在线观看| 韩曰欧美视频免费观看| 日韩视频在线一区二区| 精品av久久久久电影| 正在播放亚洲一区| 欧美日韩国产综合一区二区| 久久九九热re6这里有精品| 欧美区二区三区| 免费国产一区二区| 国产精品自拍一区| aa级大片欧美| 99日韩精品| 欧美电影在线观看完整版| 久久综合色播五月| 国产欧美日韩精品a在线观看| 日韩视频一区二区| 亚洲欧洲日产国产综合网| 久久九九全国免费精品观看| 午夜免费电影一区在线观看| 欧美日韩日本国产亚洲在线 | 最新国产成人av网站网址麻豆| 黄网站免费久久| 久久狠狠婷婷| 久久激情中文| 国产欧美日本| 性欧美18~19sex高清播放| 亚洲欧美欧美一区二区三区| 欧美日韩综合另类| 夜夜嗨一区二区| 亚洲淫性视频| 国产精品色在线| 亚洲免费视频中文字幕| 欧美亚洲三区| 国产日韩av高清| 欧美亚洲一区二区在线| 久久精品99| 伊人成人开心激情综合网| 久久精品国产99| 男女激情视频一区| 亚洲高清久久| 欧美人与性动交a欧美精品| 亚洲精品一二区| 亚洲一二三级电影| 国产精品日韩一区二区| 小嫩嫩精品导航| 免费看黄裸体一级大秀欧美| 91久久精品国产91性色| 欧美日本精品| 亚洲在线一区二区| 久久久久久久综合日本| 在线精品观看| 欧美日韩三级| 欧美在线视频一区二区| 欧美成人中文字幕| 亚洲四色影视在线观看| 国产欧美视频一区二区| 久久久在线视频| 99riav国产精品| 久久久久久久网| 亚洲精品美女在线| 国产精品v欧美精品v日韩精品 | 欧美午夜美女看片| 亚洲欧美日韩综合国产aⅴ| 久久婷婷影院| 亚洲无人区一区| 国产综合亚洲精品一区二| 欧美jizz19性欧美| 亚洲欧美国产精品桃花 | 亚洲欧美一区二区原创| 欧美激情网友自拍| 香蕉成人伊视频在线观看| 亚洲缚视频在线观看| 国产精品美女主播| 亚洲激情成人网| 欧美一区二区三区男人的天堂| 在线国产欧美| 国产欧美日本一区视频| 欧美美女bbbb| 久久久www成人免费毛片麻豆| 亚洲欧洲日本国产| 久久婷婷国产综合国色天香| 中国日韩欧美久久久久久久久| 一区精品在线播放| 国产女主播在线一区二区| 欧美日韩高清在线观看| 美女999久久久精品视频| 校园激情久久| 亚洲性图久久| 99精品久久免费看蜜臀剧情介绍| 欧美99在线视频观看| 久久久久久久999| 销魂美女一区二区三区视频在线| 亚洲乱码久久| 91久久久在线| 亚洲国产成人av在线|