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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Boost.Asio翻譯(三)[轉]

Posted on 2009-01-31 00:58 S.l.e!ep.¢% 閱讀(1557) 評論(0)  編輯 收藏 引用 所屬分類: C++

Daytime.1 - A synchronous TCP daytime client

一個同步的 TCP daytime 客戶端 ?

?

This tutorial program shows how to use asio to implement a client application with TCP.

We start by including the necessary header files.

?本示例程序顯示如何使用Asio來實現一個TCP客戶端程序。

讓我們從添加必需的頭文件開始。

						
								
										
#include? < iostream >
#include?
< boost / array.hpp >
#include?
< boost / asio.hpp >

The purpose of this application is to access a daytime service, so we need the user to specify the server.

這個應用程序的目的是訪問一個daytime服務器,因此我們需要用戶去指定服務器。(如time-nw.nist.gov,用IP亦可)

						
								
										
using ?boost::asio::ip::tcp;

int ?main( int ?argc,? char * ?argv[])
{
??
try
??{
????
if ?(argc? != ? 2 )
????{
??????std::cerr?
<< ? " Usage:?client?<host> " ? << ?std::endl;
??????
return ? 1 ;
????}

All programs that use asio need to have at least one boost::asio::io_service object.

所有使用 asio 的程序都至少需要一個boost::asio::io_service對象

						
								
????boost::asio::io_service?io_service;

We need to turn the server name that was specified as a parameter to the application, into a TCP endpoint. To do this we use an boost::asio::ip::tcp::resolver object.

?我們需要把服務器的名稱轉化為TCP的節點,而該名稱是通過應用程序的參數指定的。我們使用boost::asio::ip::tcp::resolver 對象來完成。

						
								
????tcp::resolver?resolver(io_service);

A resolver takes a query object and turns it into a list of endpoints. We construct a query using the name of the server, specified in argv[1], and the name of the service, in this case "daytime".

一個 resolver 對象 獲得一個 query 對象 , 并將其轉換為節點列表 . 我們 通過 argv[1] 中的 服務器名稱 服務名,在這里是 daytime ,構造一個 query ??

?

						
								
???tcp::resolver::query?query(argv[ 1 ],? " daytime " );

The list of endpoints is returned using an iterator of type boost::asio::ip::tcp::resolver::iterator. A default constructed boost::asio::ip::tcp::resolver::iterator object is used as the end iterator.

節點列表用 boost::asio::ip::tcp::resolver::iterator 類型的迭代器返回。返回的 iterator 將采用 boos t::asio::ip::tcp::resolver::iterator 的默認構造函數來構造。

						
								
????tcp::resolver::iterator?endpoint_iterator? = ?resolver.resolve(query);
????tcp::resolver::iterator?end;

Now we create and connect the socket. The list of endpoints obtained above may contain both IPv4 and IPv6 endpoints, so we need to try each of them until we find one that works. This keeps the client program independent of a specific IP version.

現在我們建立一個socket并連接之,由于獲得的節點既有IPv4也有IPv6的。所以,我們需要依次嘗試訪問它們直到找到一個可以正常工作的。這樣做可使得我們的程序獨立于特定的IP版本。

						
								
????tcp::socket?socket(io_service);
????boost::system::error_code?error?
= ?boost::asio::error::host_not_found;
????
while ?(error? && ?endpoint_iterator? != ?end)
????{
??????socket.close();
??????socket.connect(
* endpoint_iterator ++ ,?error);
????}
????
if ?(error)
??????
throw ?boost::system::system_error(error);

The connection is open. All we need to do now is read the response from the daytime service.

We use a boost::array to hold the received data. The boost::asio::buffer() function automatically determines the size of the array to help prevent buffer overruns. Instead of a boost::array, we could have used a char[] or std::vector.

連接打開后,現在我們需要做的就是讀取daytime服務器的響應。

我們使用boost::array 來存放接收到的數據。boost::asio::buffer()函數會自動確定array的長度來防止緩沖區溢出。我們也可以使用 char[]?或 std::vector來代替boost::array。

						
								
???? for ?(;;)
????{
??????boost::array
< char ,? 128 > ?buf;
??????boost::system::error_code?error;

??????size_t?len?
= ?socket.read_some(boost::asio::buffer(buf),?error);

When the server closes the connection, the boost::asio::ip::tcp::socket::read_some() function will exit with the boost::asio::error::eof error, which is how we know to exit the loop.

當服務器關閉連接時,boost::asio::ip::tcp::socket::read_some() 函數 boost::asio::error::eof 錯誤 標志 返回 , 通過該錯誤標志,我們知道應該退出循環了

						
								
?????? if ?(error? == ?boost::asio::error::eof)
????????
break ;? // ?Connection?closed?cleanly?by?peer.
?????? else ? if ?(error)
????????
throw ?boost::system::system_error(error);? // ?Some?other?error.

??????std::cout.write(buf.data(),?len);
????}

Finally, handle any exceptions that may have been thrown.

最后,處理所有可能拋出的異常

						
								
??}
??
catch ?(std::exception & ?e)
??{
????std::cerr?
<< ?e.what()? << ?std::endl;
??}

See the full source listing

完整代碼:

//
// ?client.cpp
// ?~~~~~~~~~~
//
// ?Copyright?(c)?2003-2008?Christopher?M.?Kohlhoff?(chris?at?kohlhoff?dot?com)
//
// ?Distributed?under?the?Boost?Software?License,?Version?1.0.?(See?accompanying? // ?file?LICENSE_1_0.txt?or?copy?at? http://www.boost.org/LICENSE_1_0.txt )
//

#include?
< iostream >
#include?
< boost / array.hpp >
#include?
< boost / asio.hpp >

using ?boost::asio::ip::tcp;

int ?main( int ?argc,? char * ?argv[])
{
??
try
??{
????
if ?(argc? != ? 2 )
????{
??????std::cerr?
<< ? " Usage:?client?<host> " ? << ?std::endl;
??????
return ? 1 ;
????}

????boost::asio::io_service?io_service;

????tcp::resolver?resolver(io_service);
????tcp::resolver::query?query(argv[
1 ],? " daytime " );
????tcp::resolver::iterator?endpoint_iterator?
= ?resolver.resolve(query);
????tcp::resolver::iterator?end;

????tcp::socket?socket(io_service);
????boost::system::error_code?error?
= ?boost::asio::error::host_not_found;
????
while ?(error? && ?endpoint_iterator? != ?end)
????{
??????socket.close();
??????socket.connect(
* endpoint_iterator ++ ,?error);
????}
????
if ?(error)
??????
throw ?boost::system::system_error(error);

????
for ?(;;)
????{
??????boost::array
< char ,? 128 > ?buf;
??????boost::system::error_code?error;

??????size_t?len?
= ?socket.read_some(boost::asio::buffer(buf),?error);

??????
if ?(error? == ?boost::asio::error::eof)
????????
break ;? // ?Connection?closed?cleanly?by?peer.
?????? else ? if ?(error)
????????
throw ?boost::system::system_error(error);? // ?Some?other?error.

??????std::cout.write(buf.data(),?len);
????}
??}
??
catch ?(std::exception & ?e)
??{
????std::cerr?
<< ?e.what()? << ?std::endl;
??}

??
return ? 0 ;
}

Daytime.2 - A synchronous TCP daytime server

一個同步的 TCP daytime 服務器

This tutorial program shows how to use asio to implement a server application with TCP.

?本示例示范如何使用Asio來實現一個TCP服務器程序。

										
												
														
#include? < ctime >
#include?
< iostream >
#include?
< string >
#include?
< boost / asio.hpp >

using ?boost::asio::ip::tcp;

We define the function make_daytime_string() to create the string to be sent back to the client. This function will be reused in all of our daytime server applications.

我們先定義一個make_daytime_string()來產生需要發送給客戶端的字符串.這個函數會在我們所有的daytime服務器上被使用。

										
												
														
std:: string ?make_daytime_string()
{
??
using ? namespace ?std;? // ?For?time_t,?time?and?ctime;
??time_t?now? = ?time( 0 );
??
return ?ctime( & now);
}

int ?main()
{
??
try
??{
????boost::asio::io_service?io_service;

A boost::asio::ip::tcp::acceptor object needs to be created to listen for new connections. It is initialised to listen on TCP port 13, for IP version 4.

新建一個asio::ip::tcp::acceptor對象來監聽新的連接。該對象應遵守IPv4協議,監聽TCP端口13

???

?

tcp::acceptor?acceptor(io_service,?tcp::endpoint(tcp::v4(),? 13 ));

?

This is an iterative server, which means that it will handle one connection at a time. Create a socket that will represent the connection to the client, and then wait for a connection.

這是一個iterative server,也就是說同一時間只能處理一個連接。建立一個表示與客戶端的連接的socket, 然后等待客戶端的連接。

										
												
???? for ?(;;)
????{
??????tcp::socket?socket(io_service);
??????acceptor.accept(socket);

A client is accessing our service. Determine the current time and transfer this information to the client.

當客戶端訪問服務器時,獲取當前時間,并傳送給客戶端。
										
												
??????std:: string ?message? = ?make_daytime_string();

??????boost::system::error_code?ignored_error;
??????boost::asio::write(socket,?boost::asio::buffer(message),
??????????boost::asio::transfer_all(),?ignored_error);
????}
??}

Finally, handle any exceptions.

最后,

處理異常。

										
												
?? catch ?(std::exception & ?e)
??{
????std::cerr?
<< ?e.what()? << ?std::endl;
??}

??
return ? 0 ;
}

See the full source listing

全部源碼:

//
// ?server.cpp
// ?~~~~~~~~~~
//
// ?Copyright?(c)?2003-2008?Christopher?M.?Kohlhoff?(chris?at?kohlhoff?dot?com)
//
// ?Distributed?under?the?Boost?Software?License,?Version?1.0.?(See?accompanying? // ?file?LICENSE_1_0.txt?or?copy?at? http://www.boost.org/LICENSE_1_0.txt )
//

#include?
< ctime >
#include?
< iostream >
#include?
< string >
#include?
< boost / asio.hpp >

using ?boost::asio::ip::tcp;

std::
string ?make_daytime_string()
{
??
using ? namespace ?std;? // ?For?time_t,?time?and?ctime;
??time_t?now? = ?time( 0 );
??
return ?ctime( & now);
}

int ?main()
{
??
try
??{
????boost::asio::io_service?io_service;

????tcp::acceptor?acceptor(io_service,?tcp::endpoint(tcp::v4(),?
13 ));

????
for ?(;;)
????{
??????tcp::socket?socket(io_service);
??????acceptor.accept(socket);

??????std::
string ?message? = ?make_daytime_string();

??????boost::system::error_code?ignored_error;
??????boost::asio::write(socket,?boost::asio::buffer(message),
??????????boost::asio::transfer_all(),?ignored_error);
????}
??}
??
catch ?(std::exception & ?e)
??{
????std::cerr?
<< ?e.what()? << ?std::endl;
??}

??
return ? 0 ;
}

The main() function

主函數

														
																
																		
int ?main()
{
??
try
??{

We need to create a server object to accept incoming client connections. The boost::asio::io_service object provides I/O services, such as sockets, that the server object will use.

我們需要創建一個服務器對象,用來接受客戶端的連接。boost::asio::io_service對象提供了像sockets這樣的I/O服務,這些服務都是服務器對象將要使用的。

														
																
????boost::asio::io_service?io_service;
????tcp_server?server(io_service);

Run the boost::asio::io_service object so that it will perform asynchronous operations on your behalf.

運行boost::asio::io_service 對象,它將執行你想要的異步操作。

														
																
????io_service.run();
??}
??
catch ?(std::exception & ?e)
??{
????std::cerr?
<< ?e.what()? << ?std::endl;
??}

??
return ? 0 ;
}
The tcp_server class

TCP服務器類

														
																
																		
class ?tcp_server
{
public :

The constructor initialises an acceptor to listen on TCP port 13.

構造函數初始化一個用于監聽TCP 端口13的接收器。

														
																
??tcp_server(boost::asio::io_service & ?io_service)
????:?acceptor_(io_service,?tcp::endpoint(tcp::v4(),?
13 ))
??{
????start_accept();
??}

private :

The function start_accept() creates a socket and initiates an asynchronous accept operation to wait for a new connection.

函數start_accept ()創建一個socket ,同時啟動一個異步接收操作去等待一個新的連接。

														
																
?? void ?start_accept()
??{
????tcp_connection::pointer?new_connection?
=
??????tcp_connection::create(acceptor_.io_service());

????acceptor_.async_accept(new_connection
-> socket(),
????????boost::bind(
& tcp_server::handle_accept,? this ,?new_connection,
??????????boost::asio::placeholders::error));
??}

The function handle_accept() is called when the asynchronous accept operation initiated by start_accept() finishes. It services the client request, and then calls start_accept() to initiate the next accept operation.

start_accept()啟動的異步接收操作完成后,handle_accept ()函數將被調用。它響應客戶端的請求,然后調用start_accept()函數去啟動另一個接收操作。

														
																
?? void ?handle_accept(tcp_connection::pointer?new_connection,
??????
const ?boost::system::error_code & ?error)
??{
????
if ?( ! error)
????{
??????new_connection
-> start();
??????start_accept();
????}
??}
The tcp_connection class

TCP連接類

We will use shared_ptr and enable_shared_from_this because we want to keep the tcp_connection object alive as long as there is an operation that refers to it.

我們希望只要還有一個操作涉及 tcp_connection對象,該對象就是有效的。因此我們使用shared_ptr enable_shared_from_this

														
																
																		
class ?tcp_connection
??:?
public ?boost::enable_shared_from_this < tcp_connection >
{
public :
??typedef?boost::shared_ptr
< tcp_connection > ?pointer;

??
static ?pointer?create(boost::asio::io_service & ?io_service)
??{
????
return ?pointer( new ?tcp_connection(io_service));
??}

??tcp::socket
& ?socket()
??{
????
return ?socket_;
??}

In the function start(), we call boost::asio::async_write() to serve the data to the client. Note that we are using boost::asio::async_write(), rather than boost::asio::ip::tcp::socket::async_write_some(), to ensure that the entire block of data is sent.

start()函數中,我們調用boost::asio::async_write()為客戶端處理數據。注意:為了確保數據被整塊發送,我們使用的是boost::asio::async_write(),而不是boost::asio::ip::tcp::socket::async_write_some()。

														
																
?? void ?start()
??{

The data to be sent is stored in the class member message_ as we need to keep the data valid until the asynchronous operation is complete.

要發送的數據保存在類成員變量message_ 中,在異步操作完成前我們需要保證數據的有效性。

?

?

????message_? = ?make_daytime_string();

?

When initiating the asynchronous operation, and if using boost::bind(), you must specify only the arguments that match the handler's parameter list. In this program, both of the argument placeholders (boost::asio::placeholders::error and boost::asio::placeholders::bytes_transferred) could potentially have been removed, since they are not being used in handle_write().

當啟動一個異步操作時,如果使用boost::bind(),你只需要指定一個符合句柄參數列表簽名的參數。在本例中,任何一個參數占位符(boost::asio::placeholders::error 和boost::asio::placeholders::bytes_transferred)皆可被隱式地移除,因為操作write()并沒有使用它們。

														
																
????boost::asio::async_write(socket_,?boost::asio::buffer(message_),
????????boost::bind(
& tcp_connection::handle_write,?shared_from_this(),
??????????boost::asio::placeholders::error,
??????????boost::asio::placeholders::bytes_transferred));

Any further actions for this client connection are now the responsibility of handle_write().

任何對客戶端連接的下一步操作都由 handle_write() 函數負責處理

?

														
																
??}

private :
??tcp_connection(boost::asio::io_service
& ?io_service)
????:?socket_(io_service)
??{
??}

??
void ?handle_write( const ?boost::system::error_code & ? /* error */ ,
??????size_t?
/* bytes_transferred */ )
??{
??}

??tcp::socket?socket_;
??std::
string ?message_;
};
Removing unused handler parameters

移除無用的操作參數

You may have noticed that the error, and bytes_transferred parameters are not used in the body of the handle_write() function. If parameters are not needed, it is possible to remove them from the function so that it looks like:

你可能已經注意到了:error和bytes_transferred 參數并沒有在 handle_write() 函數體內被應用。因此,如果參數并不是必須的,我們可以移除它們,如下所示:

														
																
?? void ?handle_write()
??{
??}

The boost::asio::async_write() call used to initiate the call can then be changed to just:

用來發起呼叫的boost::asio::async_write()函數通常可以被改寫成下面這樣:

														
																
??boost::asio::async_write(socket_,?boost::asio::buffer(message_),
??????boost::bind(
& tcp_connection::handle_write,?shared_from_this()));

See the full source listing

全部源碼:

//
// ?server.cpp
// ?~~~~~~~~~~
//
// ?Copyright?(c)?2003-2008?Christopher?M.?Kohlhoff?(chris?at?kohlhoff?dot?com)
//
// ?Distributed?under?the?Boost?Software?License,?Version?1.0.?(See?accompanying? // ?file?LICENSE_1_0.txt?or?copy?at? http://www.boost.org/LICENSE_1_0.txt )
//

#include?
< ctime >
#include?
< iostream >
#include?
< string >
#include?
< boost / bind.hpp >
#include?
< boost / shared_ptr.hpp >
#include?
< boost / enable_shared_from_this.hpp >
#include?
< boost / asio.hpp >

using ?boost::asio::ip::tcp;

std::
string ?make_daytime_string()
{
??
using ? namespace ?std;? // ?For?time_t,?time?and?ctime;
??time_t?now? = ?time( 0 );
??
return ?ctime( & now);
}

class ?tcp_connection
??:?
public ?boost::enable_shared_from_this < tcp_connection >
{
public :
??typedef?boost::shared_ptr
< tcp_connection > ?pointer;

??
static ?pointer?create(boost::asio::io_service & ?io_service)
??{
????
return ?pointer( new ?tcp_connection(io_service));
??}

??tcp::socket
& ?socket()
??{
????
return ?socket_;
??}

??
void ?start()
??{
????message_?
= ?make_daytime_string();

????boost::asio::async_write(socket_,?boost::asio::buffer(message_),
????????boost::bind(
& tcp_connection::handle_write,?shared_from_this(),
??????????boost::asio::placeholders::error,
??????????boost::asio::placeholders::bytes_transferred));
??}

private :
??tcp_connection(boost::asio::io_service
& ?io_service)
????:?socket_(io_service)
??{
??}

??
void ?handle_write( const ?boost::system::error_code & ? /* error */ ,
??????size_t?
/* bytes_transferred */ )
??{
??}

??tcp::socket?socket_;
??std::
string ?message_;
};

class ?tcp_server
{
public :
??tcp_server(boost::asio::io_service
& ?io_service)
????:?acceptor_(io_service,?tcp::endpoint(tcp::v4(),?
13 ))
??{
????start_accept();
??}

private :
??
void ?start_accept()
??{
????tcp_connection::pointer?new_connection?
=
??????tcp_connection::create(acceptor_.io_service());

????acceptor_.async_accept(new_connection
-> socket(),
????????boost::bind(
& tcp_server::handle_accept,? this ,?new_connection,
??????????boost::asio::placeholders::error));
??}

??
void ?handle_accept(tcp_connection::pointer?new_connection,
??????
const ?boost::system::error_code & ?error)
??{
????
if ?( ! error)
????{
??????new_connection
-> start();
??????start_accept();
????}
??}

??tcp::acceptor?acceptor_;
};

int ?main()
{
??
try
??{
????boost::asio::io_service?io_service;
????tcp_server?server(io_service);
????io_service.run();
??}
??
catch ?(std::exception & ?e)
??{
????std::cerr?
<< ?e.what()? << ?std::endl;
??}

??
return ? 0 ;
}

?

?
posted on 2008-04-20 01:27 王曉軒 閱讀(1533) 評論(0) ?編輯?收藏引用 所屬分類: C\C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美aaa级| 日韩视频一区二区三区| 欧美成人亚洲成人| 免费观看成人| 欧美激情一区| 欧美性做爰猛烈叫床潮| 国产精品久久婷婷六月丁香| 国产麻豆精品theporn| 国产欧美精品在线观看| 亚洲高清资源| 亚洲一区二区四区| 久久久亚洲高清| 亚洲国产一区视频| 亚洲视频日本| 久久久午夜视频| 国产精品videosex极品| 国产在线欧美| 亚洲视频在线观看| 久久影视精品| 一本大道久久a久久综合婷婷| 性亚洲最疯狂xxxx高清| 欧美电影电视剧在线观看| 国产精品成人在线观看| 亚洲成人资源网| 亚洲欧美日韩国产中文在线| 久久亚洲精品伦理| 亚洲欧美变态国产另类| 欧美电影美腿模特1979在线看| 国产精品午夜视频| 日韩亚洲国产欧美| 另类尿喷潮videofree| 亚洲视频精品在线| 欧美多人爱爱视频网站| 国产日韩精品电影| 亚洲一区二区久久| 亚洲国产专区校园欧美| 久久久久久久尹人综合网亚洲 | 久久精品夜夜夜夜久久| 欧美国产精品| 亚洲国产日本| 久久亚洲综合| 亚洲欧美日韩在线一区| 国产曰批免费观看久久久| 亚洲一区二区3| 久久午夜激情| 午夜精彩视频在线观看不卡 | 在线成人性视频| 欧美综合国产| 亚洲一区二区三区777| 欧美另类高清视频在线| 亚洲国产日韩一区二区| 久久综合久久88| 欧美亚洲一区三区| 国产欧美日韩亚洲精品| 亚洲综合精品自拍| 一本色道久久综合亚洲精品不卡| 久久中文精品| 亚洲国产婷婷香蕉久久久久久99| 久久综合导航| 久久色在线播放| 在线高清一区| 免费日韩av| 裸体歌舞表演一区二区| 亚洲国产精品一区制服丝袜| 欧美成人高清| 欧美经典一区二区三区| 一区二区三区毛片| 正在播放亚洲一区| 国产噜噜噜噜噜久久久久久久久| 欧美在线观看www| 性久久久久久久久| 狠狠色伊人亚洲综合成人| 蜜臀99久久精品久久久久久软件 | 免费亚洲一区二区| 亚洲精品免费看| 99国产精品| 国产欧美精品一区| 欧美 日韩 国产精品免费观看| 免费观看久久久4p| 欧美一级二级三级蜜桃| 永久域名在线精品| 亚洲欧洲日韩女同| 欧美性事免费在线观看| 久久久久久久久久久久久女国产乱| 欧美一区二区三区啪啪| 亚洲国产一区二区三区在线播| 亚洲人成7777| 国产日韩精品久久| 欧美激情一区二区三区四区| 国产精品超碰97尤物18| 久久视频一区| 欧美人与性动交α欧美精品济南到| 亚洲男人影院| 久色成人在线| 欧美一区2区三区4区公司二百| 久久最新视频| 欧美一区二区三区视频| 嫩草影视亚洲| 久久国产精品72免费观看| 欧美激情网友自拍| 国产欧美精品xxxx另类| 在线精品观看| 亚洲一区二区免费看| 亚洲国产日日夜夜| 小处雏高清一区二区三区| 99在线视频精品| 久久琪琪电影院| 午夜精品久久久久久久| 欧美精品久久一区| 久热爱精品视频线路一| 国产精品久久网站| 亚洲免费av片| 亚洲精品美女在线| 久久露脸国产精品| 久久精品视频亚洲| 国产精品mm| 一区二区三区免费观看| 99v久久综合狠狠综合久久| 久久亚洲影音av资源网| 欧美在线精品一区| 国产精品一区二区在线观看不卡| 亚洲人成网在线播放| 亚洲国产精品美女| 另类综合日韩欧美亚洲| 美女视频网站黄色亚洲| 狠狠色丁香婷婷综合久久片| 午夜国产精品影院在线观看| 欧美亚洲综合另类| 国产酒店精品激情| 午夜伦理片一区| 久久精品视频99| 国内精品久久久久影院优| 欧美在线短视频| 久久久国产91| 激情丁香综合| 牛牛国产精品| 亚洲国产精品一区二区www| 亚洲国产精品一区| 奶水喷射视频一区| 亚洲片在线资源| 亚洲少妇自拍| 国产精品一区二区女厕厕| 欧美亚洲系列| 蜜桃精品久久久久久久免费影院| 亚洲第一黄色| 欧美激情综合在线| 一区二区三区福利| 性欧美超级视频| 一区二区在线观看视频在线观看 | 亚洲日产国产精品| 亚洲一区国产一区| 国产三级精品三级| 久久久国产午夜精品| 亚洲第一精品久久忘忧草社区| 日韩亚洲欧美中文三级| 国产精品成av人在线视午夜片| 亚洲欧美日韩国产综合在线| 久久综合色综合88| 99国产精品久久久久久久| 国产精品免费一区二区三区在线观看| 亚洲欧美日韩区| 欧美激情欧美狂野欧美精品| 亚洲一区视频在线观看视频| 国产一区二区三区精品久久久| 男人的天堂亚洲在线| 亚洲一区二区视频在线观看| 欧美www在线| 亚洲欧美日韩人成在线播放| 99精品视频免费全部在线| 国产一区二区久久| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲人成免费| 久久天堂av综合合色| 日韩午夜av电影| 国产婷婷色综合av蜜臀av| 欧美大成色www永久网站婷| 亚洲综合国产精品| 亚洲高清激情| 美女精品视频一区| 久久成人18免费网站| 99国产精品| 在线欧美小视频| 国产九区一区在线| 欧美视频在线不卡| 免费影视亚洲| 久久成人免费网| 一区二区三区成人精品| 亚洲激情视频在线播放| 开元免费观看欧美电视剧网站| 亚洲香蕉网站| 亚洲精品欧美日韩专区| 影音先锋日韩有码| 国产欧美日韩在线视频| 欧美视频一区二区三区…| 欧美国产亚洲精品久久久8v| 久久婷婷久久| 久久人91精品久久久久久不卡 | 亚洲成人资源| 看欧美日韩国产| 久久久蜜臀国产一区二区|