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

posts - 6,  comments - 61,  trackbacks - 0

Daytime.1 - A synchronous TCP daytime client

一個(gè)同步的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來實(shí)現(xiàn)一個(gè)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.

這個(gè)應(yīng)用程序的目的是訪問一個(gè)daytime服務(wù)器,因此我們需要用戶去指定服務(wù)器。(如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的程序都至少需要一個(gè)boost::asio::io_service對(duì)象


    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.

 我們需要把服務(wù)器的名稱轉(zhuǎn)化為TCP的節(jié)點(diǎn),而該名稱是通過應(yīng)用程序的參數(shù)指定的。我們使用boost::asio::ip::tcp::resolver 對(duì)象來完成。


    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".

一個(gè)resolver對(duì)象獲得一個(gè)query對(duì)象,并將其轉(zhuǎn)換為節(jié)點(diǎn)列表.我們通過argv[1]中的服務(wù)器名稱服務(wù)名,在這里是daytime,構(gòu)造一個(gè)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.

節(jié)點(diǎn)列表用 boost::asio::ip::tcp::resolver::iterator 類型的迭代器返回。返回的iterator將采用boost::asio::ip::tcp::resolver::iterator的默認(rèn)構(gòu)造函數(shù)來構(gòu)造。


    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.

現(xiàn)在我們建立一個(gè)socket并連接之,由于獲得的節(jié)點(diǎn)既有IPv4也有IPv6的。所以,我們需要依次嘗試訪問它們直到找到一個(gè)可以正常工作的。這樣做可使得我們的程序獨(dú)立于特定的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.

連接打開后,現(xiàn)在我們需要做的就是讀取daytime服務(wù)器的響應(yīng)。

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


    for (;;)
    {
      boost::array
<char128> 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.

當(dāng)服務(wù)器關(guān)閉連接時(shí),boost::asio::ip::tcp::socket::read_some()函數(shù)會(huì)boost::asio::error::eof錯(cuò)誤標(biāo)志返回, 通過該錯(cuò)誤標(biāo)志,我們知道應(yīng)該退出循環(huán)了


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

一個(gè)同步的TCP daytime服務(wù)器

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

 本示例示范如何使用Asio來實(shí)現(xiàn)一個(gè)TCP服務(wù)器程序。


#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.

我們先定義一個(gè)make_daytime_string()來產(chǎn)生需要發(fā)送給客戶端的字符串.這個(gè)函數(shù)會(huì)在我們所有的daytime服務(wù)器上被使用。


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.

新建一個(gè)asio::ip::tcp::acceptor對(duì)象來監(jiān)聽新的連接。該對(duì)象應(yīng)遵守IPv4協(xié)議,監(jiān)聽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.

這是一個(gè)iterative server,也就是說同一時(shí)間只能處理一個(gè)連接。建立一個(gè)表示與客戶端的連接的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.

當(dāng)客戶端訪問服務(wù)器時(shí),獲取當(dāng)前時(shí)間,并傳送給客戶端。

      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

主函數(shù)


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.

我們需要?jiǎng)?chuàng)建一個(gè)服務(wù)器對(duì)象,用來接受客戶端的連接。boost::asio::io_service對(duì)象提供了像sockets這樣的I/O服務(wù),這些服務(wù)都是服務(wù)器對(duì)象將要使用的。


    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.

運(yùn)行boost::asio::io_service 對(duì)象,它將執(zhí)行你想要的異步操作。


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

  
return 0;
}
The tcp_server class

TCP服務(wù)器類


class tcp_server
{
public:

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

構(gòu)造函數(shù)初始化一個(gè)用于監(jiān)聽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.

函數(shù)start_accept()創(chuàng)建一個(gè)socket ,同時(shí)啟動(dòng)一個(gè)異步接收操作去等待一個(gè)新的連接。


  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.

當(dāng)start_accept()啟動(dòng)的異步接收操作完成后,handle_accept()函數(shù)將被調(diào)用。它響應(yīng)客戶端的請(qǐng)求,然后調(diào)用start_accept()函數(shù)去啟動(dòng)另一個(gè)接收操作。


  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.

我們希望只要還有一個(gè)操作涉及tcp_connection對(duì)象,該對(duì)象就是有效的。因此我們使用shared_ptrenable_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()函數(shù)中,我們調(diào)用boost::asio::async_write()為客戶端處理數(shù)據(jù)。注意:為了確保數(shù)據(jù)被整塊發(fā)送,我們使用的是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.

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

 

 

    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().

當(dāng)啟動(dòng)一個(gè)異步操作時(shí),如果使用boost::bind(),你只需要指定一個(gè)符合句柄參數(shù)列表簽名的參數(shù)。在本例中,任何一個(gè)參數(shù)占位符(boost::asio::placeholders::error 和boost::asio::placeholders::bytes_transferred)皆可被隱式地移除,因?yàn)椴僮?font id=ga9. face="Courier New" goog_docs_charIndex="4205">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().

任何對(duì)客戶端連接的下一步操作都由handle_write()函數(shù)負(fù)責(zé)處理

 


  }

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

移除無用的操作參數(shù)

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:

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


  void handle_write()
  {
  }

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

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


  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 王曉軒 閱讀(4270) 評(píng)論(7)  編輯 收藏 引用 所屬分類: C\C++

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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲午夜影视影院在线观看| 国产精品magnet| 久久国产一二区| 欧美日韩国产小视频| 久久色在线观看| 国产欧美日韩三级| 99精品欧美一区二区三区综合在线| 一区久久精品| 香蕉成人久久| 欧美一级专区| 国产精品久久久久久影视 | 久久国产乱子精品免费女 | 亚洲第一在线综合在线| 一区二区三区欧美在线观看| 亚洲精品裸体| 久久人体大胆视频| 久久综合狠狠综合久久激情| 国产精品爽黄69| 一区二区三区日韩欧美精品| 亚洲黄色av一区| 美乳少妇欧美精品| 欧美.日韩.国产.一区.二区| 国产综合久久| 久久精品视频导航| 另类综合日韩欧美亚洲| 国语自产精品视频在线看| 亚洲视频999| 欧美一区二区三区视频在线观看| 国产精品扒开腿做爽爽爽软件 | 亚洲视频每日更新| 亚洲一区在线免费观看| 欧美性感一类影片在线播放 | 国产日韩欧美不卡| 亚洲男女毛片无遮挡| 久久国产精品久久w女人spa| 国产精品高清一区二区三区| 一区二区三区高清| 亚洲永久在线观看| 国产伦精品一区二区三区免费迷| 亚洲在线成人精品| 久久久久高清| 在线看视频不卡| 欧美成人有码| 99re在线精品| 欧美在线二区| 亚洲国产精品一区二区久| 欧美二区视频| 一区二区高清在线观看| 久久av一区二区三区漫画| 激情五月综合色婷婷一区二区| 毛片精品免费在线观看| 亚洲美女中文字幕| 久久九九免费| 亚洲美女区一区| 国产精品美女在线| 久久久久网址| 日韩一级网站| 久久中文精品| 一二三区精品| 激情欧美一区二区三区| 欧美精品1区2区| 香蕉久久一区二区不卡无毒影院| 欧美/亚洲一区| 亚洲一区二区在线免费观看视频 | 欧美激情一区三区| 亚洲欧美日韩视频一区| 精品91视频| 国产精品久久999| 猛干欧美女孩| 亚洲欧美国产精品va在线观看| 欧美成人性网| 久久av资源网| 一区二区冒白浆视频| 国内外成人免费激情在线视频| 欧美精选一区| 久久青草久久| 小嫩嫩精品导航| 日韩午夜在线视频| 欧美华人在线视频| 久久婷婷一区| 先锋影音网一区二区| 99精品视频免费观看视频| 国产综合视频| 国产精品你懂的| 欧美日韩亚洲一区二| 你懂的国产精品| 久久网站免费| 久久精品夜夜夜夜久久| 亚洲系列中文字幕| 日韩亚洲一区在线播放| 亚洲第一精品在线| 欧美亚洲日本国产| 亚洲尤物视频网| 9国产精品视频| 亚洲精品中文在线| 亚洲国产小视频| 在线色欧美三级视频| 国产视频综合在线| 国产视频亚洲精品| 国产精品永久免费在线| 国产精品久久久久久久久久直播 | 国产三区二区一区久久| 国产精品国产一区二区| 欧美精品在线网站| 欧美精品观看| 欧美日韩91| 欧美男人的天堂| 欧美日韩国产123区| 欧美久久久久免费| 欧美日韩一区二区三区在线 | 亚洲一二三区精品| 一区二区三区视频在线播放| 亚洲久久一区| 99综合在线| 亚洲私人黄色宅男| 午夜精品久久久久久99热软件| 亚洲一区二区三区精品视频| 亚洲一区二区不卡免费| 亚洲宅男天堂在线观看无病毒| 亚洲一区二区三区三| 香蕉成人啪国产精品视频综合网| 欧美一区二区高清在线观看| 欧美中文在线观看国产| 久久精品在线免费观看| 久久久天天操| 免费人成网站在线观看欧美高清| 欧美激情第1页| 国产精品成人aaaaa网站| 国产精品人人做人人爽| 国产在线精品二区| 亚洲激情第一区| 亚洲午夜久久久久久尤物| 先锋影音久久| 欧美成人综合一区| 99国产精品久久久久老师| 午夜久久黄色| 你懂的视频欧美| 国产精品久久久久毛片软件| 国产亚洲精品久久久久动| 亚洲国内高清视频| 亚洲尤物在线| 老司机午夜精品视频在线观看| 亚洲电影免费在线观看| 亚洲午夜在线视频| 久久综合狠狠综合久久综合88 | 欧美成人免费小视频| 国产精品久99| 亚洲国产合集| 午夜精品成人在线视频| 欧美国产日韩免费| 亚洲欧美日韩国产一区| 欧美成人dvd在线视频| 国产精品久久久久久妇女6080| 一区二区亚洲| 亚洲午夜在线观看| 欧美成人免费在线观看| 亚洲欧美日韩国产| 欧美精品精品一区| 极品尤物av久久免费看| 一区二区三区精品视频| 欧美大片在线观看| 欧美一级午夜免费电影| 欧美视频第二页| 91久久精品国产91性色| 久久漫画官网| 中日韩男男gay无套| 欧美激情精品久久久久久久变态| 国产一区二区电影在线观看 | 亚洲欧美网站| 欧美日韩国产一级| 亚洲国产三级| 久久久午夜电影| 香蕉精品999视频一区二区| 欧美日韩午夜| 日韩视频一区二区三区| 男女视频一区二区| 欧美亚洲午夜视频在线观看| 欧美日韩免费精品| 亚洲美女在线视频| 欧美韩日一区二区| 久久婷婷国产综合国色天香| 国产欧美91| 香蕉久久久久久久av网站| 一区二区三区福利| 欧美体内谢she精2性欧美| 亚洲另类一区二区| 亚洲国内精品在线| 免费观看30秒视频久久| 136国产福利精品导航网址| 久久人人97超碰国产公开结果 | 亚洲主播在线播放| 日韩视频免费在线观看| 欧美粗暴jizz性欧美20| 91久久黄色| 最近看过的日韩成人| 男女av一区三区二区色多| 亚洲国产精品美女| 亚洲风情亚aⅴ在线发布| 欧美a级理论片| 夜夜嗨av一区二区三区四季av |