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

posts - 6,  comments - 61,  trackbacks - 0

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來實現(xiàn)一個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.

這個應(yīng)用程序的目的是訪問一個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的程序都至少需要一個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.

 我們需要把服務(wù)器的名稱轉(zhuǎn)化為TCP的節(jié)點,而該名稱是通過應(yīng)用程序的參數(shù)指定的。我們使用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對象,并將其轉(zhuǎn)換為節(jié)點列表.我們通過argv[1]中的服務(wù)器名稱服務(wù)名,在這里是daytime,構(gòu)造一個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é)點列表用 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)在我們建立一個socket并連接之,由于獲得的節(jié)點既有IPv4也有IPv6的。所以,我們需要依次嘗試訪問它們直到找到一個可以正常工作的。這樣做可使得我們的程序獨(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ù)會自動確定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)閉連接時,boost::asio::ip::tcp::socket::read_some()函數(shù)boost::asio::error::eof錯誤標(biāo)志返回, 通過該錯誤標(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

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

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

 本示例示范如何使用Asio來實現(xiàn)一個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.

我們先定義一個make_daytime_string()來產(chǎn)生需要發(fā)送給客戶端的字符串.這個函數(shù)會在我們所有的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.

新建一個asio::ip::tcp::acceptor對象來監(jiān)聽新的連接。該對象應(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.

這是一個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.

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

      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.

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


    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 對象,它將執(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ù)初始化一個用于監(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)建一個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.

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


  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_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)啟動一個異步操作時,如果使用boost::bind(),你只需要指定一個符合句柄參數(shù)列表簽名的參數(shù)。在本例中,任何一個參數(shù)占位符(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()函數(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 王曉軒 閱讀(4256) 評論(7)  編輯 收藏 引用 所屬分類: 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>
            亚洲免费在线观看| 一区二区三区四区蜜桃| 久久色在线观看| 久久久久成人精品免费播放动漫| 国语自产偷拍精品视频偷 | 国产精品国产三级国产普通话蜜臀| 99re亚洲国产精品| 亚洲在线视频网站| 伊人成年综合电影网| 91久久精品国产91久久| 欧美久久久久久久久| 午夜精品影院| 玖玖玖免费嫩草在线影院一区| 日韩视频中午一区| 亚洲欧美中日韩| 日韩一区二区精品葵司在线| 亚洲特级片在线| 在线欧美日韩国产| 在线亚洲自拍| 亚洲破处大片| 亚洲欧美色婷婷| 日韩视频国产视频| 亚洲欧美在线免费| 一区二区久久| 久久综合久久综合久久| 欧美伊人久久| 欧美日韩不卡在线| 久久综合久久88| 国产精品日本| 日韩网站在线观看| 91久久久亚洲精品| 久久久久99精品国产片| 亚洲一区免费视频| 欧美激情视频给我| 牛牛影视久久网| 国产日韩一区| 一区二区欧美在线| 日韩写真在线| 免费亚洲电影| 看欧美日韩国产| 国产日韩欧美综合在线| 一本色道**综合亚洲精品蜜桃冫| 91久久香蕉国产日韩欧美9色| 欧美一区二区| 欧美一区二区三区在线播放| 欧美极品aⅴ影院| 亚洲成人自拍视频| 在线看日韩欧美| 久久精品理论片| 久久久久久色| 欧美一区二区在线看| 亚洲欧美国产一区二区三区| 欧美日产一区二区三区在线观看| 亚洲电影第三页| 亚洲经典在线看| 欧美va天堂va视频va在线| 蜜臀a∨国产成人精品| 精品白丝av| 久久中文欧美| 亚洲第一天堂无码专区| 亚洲电影免费在线| 老司机成人在线视频| 免费久久精品视频| 亚洲激情影院| 欧美激情一区在线观看| 亚洲黄网站黄| 亚洲综合视频1区| 国产毛片一区| 久久久99国产精品免费| 老司机亚洲精品| 91久久精品国产91性色tv| 欧美成人精品h版在线观看| 欧美电影在线| 亚洲无线一线二线三线区别av| 欧美婷婷在线| 亚洲欧美一级二级三级| 另类激情亚洲| 日韩一级在线| 国产麻豆91精品| 久久天堂成人| 亚洲日本无吗高清不卡| 亚洲一区二区三区欧美 | 久久久国际精品| 亚洲成色777777女色窝| 亚洲视频一区二区在线观看| 国产精品日本一区二区| 久久精品三级| 亚洲精品免费在线观看| 欧美淫片网站| 亚洲激情婷婷| 国产欧美日韩综合一区在线播放| 久久精品视频在线播放| 91久久在线| 久久久久久久97| 日韩网站在线看片你懂的| 国产精品国产自产拍高清av| 欧美在线视频播放| 亚洲精品在线视频观看| 久久超碰97人人做人人爱| 亚洲欧洲日产国产综合网| 国产精品久久久久久超碰| 久久久精品国产免大香伊| 日韩午夜免费视频| 欧美成人69av| 欧美亚洲视频一区二区| 91久久国产精品91久久性色| 国产精品国产馆在线真实露脸| 久久精品人人做人人爽电影蜜月| 亚洲精品激情| 美女精品自拍一二三四| 午夜欧美理论片| 日韩性生活视频| 91久久精品国产91久久性色| 国产美女一区二区| 欧美日韩精品一区| 裸体一区二区三区| 久久国产福利国产秒拍| 亚洲一级二级在线| 99伊人成综合| 亚洲欧洲综合另类在线| 久久久综合视频| 久久久精品一品道一区| 欧美一二区视频| 国产日韩精品一区| 国产精品久久久免费| 欧美日韩成人免费| 欧美大片一区| 美女日韩欧美| 乱中年女人伦av一区二区| 久久久久久久国产| 久久精品国产99| 久久成人综合网| 欧美一区二区| 久久久久中文| 久久久91精品国产一区二区精品| 午夜激情久久久| 亚洲综合欧美日韩| 中日韩视频在线观看| 99国产一区| 亚洲少妇中出一区| 亚洲深夜福利视频| 亚洲色图在线视频| 亚洲免费视频一区二区| 亚洲视频导航| 亚洲字幕一区二区| 欧美在线视频二区| 久久久人人人| 欧美福利一区| 欧美日韩美女在线| 国产精品久久一区主播| 国产精品入口日韩视频大尺度| 欧美性猛交xxxx乱大交蜜桃| 国产精品videosex极品| 国产精品一二三四区| 狠狠色噜噜狠狠色综合久| 一区二区三区在线免费视频| 亚洲国产日韩在线| 亚洲天堂av在线免费观看| 先锋亚洲精品| 男男成人高潮片免费网站| 亚洲二区在线视频| 一区二区三区视频在线| 欧美怡红院视频一区二区三区| 久久天天狠狠| 欧美日韩在线播放一区二区| 国产精品每日更新| 一区二区三区在线视频播放| 亚洲激情图片小说视频| 午夜精品三级视频福利| 久久午夜激情| 亚洲美女精品成人在线视频| 亚洲欧美一区二区激情| 免费在线观看精品| 国产精品日韩欧美一区二区| 一区二区三区在线不卡| 一本色道久久综合亚洲精品按摩| 午夜伦欧美伦电影理论片| 另类酷文…触手系列精品集v1小说| 亚洲三级电影在线观看| 欧美一区久久| 欧美日韩一区二区精品| 国产一区二区三区无遮挡| 亚洲精品一区二区三区99| 性做久久久久久久免费看| 亚洲国产精品va| 欧美一区二区黄| 国产精品a久久久久| 激情欧美一区| 先锋影音久久久| 亚洲日本va午夜在线电影| 久久成人精品无人区| 欧美视频三区在线播放| 91久久精品视频| 久久亚洲综合网| 亚洲综合电影一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美精品久久久久a| 国产亚洲精品久久久久婷婷瑜伽| 亚洲深夜福利| 亚洲国产精品成人综合|