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

陳碩的Blog

發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù)

發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù)

陳碩 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

2010 Aug 30

本文主要介紹 muduo 網(wǎng)絡(luò)庫(kù)的使用。其設(shè)計(jì)與實(shí)現(xiàn)將有另文講解。

目錄

由來(lái) 1

下載與編譯 2

例子 2

基本結(jié)構(gòu) 3

公開(kāi)接口 4

內(nèi)部實(shí)現(xiàn) 4

線(xiàn)程模型 5

結(jié)語(yǔ) 5

由來(lái)

半年前我寫(xiě)了一篇《學(xué)之者生,用之者死——ACE歷史與簡(jiǎn)評(píng)》,其中提到“我心目中理想的網(wǎng)絡(luò)庫(kù)”的樣子:

  • 線(xiàn)程安全,支持多核多線(xiàn)程
  • 不考慮可移植性,不跨平臺(tái),只支持 Linux,不支持 Windows。
  • 在不增加復(fù)雜度的前提下可以支持 FreeBSD/Darwin,方便將來(lái)用 Mac 作為開(kāi)發(fā)用機(jī),但不為它做性能優(yōu)化。也就是說(shuō) IO multiplexing 使用 poll 和 epoll。
  • 主要支持 x86-64,兼顧 IA32
  • 不支持 UDP,只支持 TCP
  • 不支持 IPv6,只支持 IPv4
  • 不考慮廣域網(wǎng)應(yīng)用,只考慮局域網(wǎng)
  • 只支持一種使用模式:non-blocking IO + one event loop per thread,不考慮阻塞 IO
  • API 簡(jiǎn)單易用,只暴露具體類(lèi)和標(biāo)準(zhǔn)庫(kù)里的類(lèi),不使用 non-trivial templates,也不使用虛函數(shù)
  • 只滿(mǎn)足常用需求的 90%,不面面俱到,必要的時(shí)候以 app 來(lái)適應(yīng) lib
  • 只做 library,不做成 framework
  • 爭(zhēng)取全部代碼在 5000 行以?xún)?nèi)(不含測(cè)試)
  • 以上條件都滿(mǎn)足時(shí),可以考慮搭配 Google Protocol Buffers RPC

在想清楚這些目標(biāo)之后,我開(kāi)始第三次嘗試編寫(xiě)自己的 C++ 網(wǎng)絡(luò)庫(kù)。與前兩次不同,這次我一開(kāi)始就想好了庫(kù)的名字,叫 muduo (木鐸),并在 Google code 上創(chuàng)建了項(xiàng)目: http://code.google.com/p/muduo/ 。muduo 的主體內(nèi)容在 5 月底已經(jīng)基本完成,現(xiàn)在我把它開(kāi)源。

本文主要介紹 muduo 網(wǎng)絡(luò)庫(kù)的使用,其設(shè)計(jì)與實(shí)現(xiàn)將有另文講解。

下載與編譯

下載地址: http://muduo.googlecode.com/files/muduo-0.1.0-alpha.tar.gz

SHA1 Checksum: 5d3642e311177ded89ed0d15c10921738f8c984c

Muduo 使用了 Linux 較新的系統(tǒng)調(diào)用,要求 Linux 的內(nèi)核版本大于 2.6.28 (我自己用的是 2.6.32 )。在 Debian Squeeze / Ubuntu 10.04 LTS 上編譯測(cè)試通過(guò),32 位和 64 位系統(tǒng)都能使用。

Muduo 采用 CMake 為 build system,安裝方法:

$ sudo apt-get install cmake

Muduo 依賴(lài) Boost,很容易安裝:

$ sudo apt-get install libboost1.40-dev # 或 libboost1.42-dev

編譯方法很簡(jiǎn)單:

$ tar zxf muduo-0.1.0-alpha.tar.gz

$ cd muduo/

$ ./build.sh

# 編譯生成的可執(zhí)行文件和靜態(tài)庫(kù)文件分別位于 ../build/debug/{bin,lib}

如果要編譯 release 版,可執(zhí)行

$ BUILD_TYPE=release ./build.sh

# 編譯生成的可執(zhí)行文件和靜態(tài)庫(kù)文件分別位于 ../build/release/{bin,lib}

編譯完成之后請(qǐng)?jiān)囘\(yùn)行其中的例子。比如 bin/inspector_test ,然后通過(guò)瀏覽器訪(fǎng)問(wèn) http://10.0.0.10:12345/ 或 http://10.0.0.10:12345/proc/status,其中 10.0.0.10 替換為你的 Linux box 的 IP。

例子

Muduo 附帶了幾十個(gè)小例子,位于 examples 目錄。其中包括從 Boost.Asio、JBoss Netty、Python Twisted 等處移植過(guò)來(lái)的例子。

examples

|-- simple # 簡(jiǎn)單網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)

|   |-- allinone  # 在一個(gè)程序里同時(shí)實(shí)現(xiàn)下面 5 個(gè)協(xié)議

|   |-- chargen   # RFC 864,可測(cè)試帶寬

|   |-- daytime # RFC 867

|   |-- discard # RFC 863

|   |-- echo # RFC 862

|   |-- time # RFC 868

|   `-- timeclient # time 協(xié)議的客戶(hù)端

|-- hub # 一個(gè)簡(jiǎn)單的 pub/sub/hub 服務(wù),演示應(yīng)用級(jí)的廣播

|-- roundtrip # 測(cè)試兩臺(tái)機(jī)器的網(wǎng)絡(luò)延時(shí)與時(shí)間差

|-- asio # 從 Boost.Asio 移植的例子

|   |-- chat # 聊天服務(wù)

|   `-- tutorial # 一系列 timers

|-- netty # 從 JBoss Netty 移植的例子

|   |-- discard # 可用于測(cè)試帶寬,服務(wù)器可多線(xiàn)程運(yùn)行

|   |-- echo # 可用于測(cè)試帶寬,服務(wù)器可多線(xiàn)程運(yùn)行

|   `-- uptime # TCP 長(zhǎng)連接

`-- twisted # 從 Python Twisted 移植的例子

    `-- finger # finger01 ~ 07

基本結(jié)構(gòu)

Muduo 的目錄結(jié)構(gòu)如下。

muduo

|-- base # 與網(wǎng)絡(luò)無(wú)關(guān)的基礎(chǔ)代碼,已提前發(fā)布

`-- net # 網(wǎng)絡(luò)庫(kù)

    |-- http # 一個(gè)簡(jiǎn)單的可嵌入的 web 服務(wù)器

    |-- inspect # 基于以上 web 服務(wù)器的“窺探器”,用于報(bào)告進(jìn)程的狀態(tài)

    `-- poller # poll(2) 和 epoll(4) 兩種 IO multiplexing 后端

Muduo 是基于 Reactor 模式的網(wǎng)絡(luò)庫(kù),其核心是個(gè)事件循環(huán) EventLoop,用于響應(yīng)計(jì)時(shí)器和 IO 事件。Muduo 采用基于對(duì)象(object based)而非面向?qū)ο螅╫bject oriented)的設(shè)計(jì)風(fēng)格,其接口多以 boost::function + boost::bind 表達(dá)。

Muduo 的頭文件明確分為客戶(hù)可見(jiàn)和客戶(hù)不可見(jiàn)兩類(lèi)。客戶(hù)可見(jiàn)的為白底,客戶(hù)不可見(jiàn)的為灰底。

inc

這里簡(jiǎn)單介紹各個(gè)頭文件及 class 的作用,詳細(xì)的介紹留給以后的博客。

公開(kāi)接口
  • Buffer 仿 Netty ChannelBuffer 的 buffer class,數(shù)據(jù)的讀寫(xiě)透過(guò) buffer 進(jìn)行
  • InetAddress 封裝 IPv4 地址 (end point),注意,muduo 目前不能解析域名,只認(rèn) IP
  • EventLoop 反應(yīng)器 Reactor,用戶(hù)可以注冊(cè)計(jì)時(shí)器回調(diào)
  • EventLoopThread 啟動(dòng)一個(gè)線(xiàn)程,在其中運(yùn)行 EventLoop::loop()
  • TcpConnection 整個(gè)網(wǎng)絡(luò)庫(kù)的核心,封裝一次 TCP 連接
  • TcpClient 用于編寫(xiě)網(wǎng)絡(luò)客戶(hù)端,能發(fā)起連接,并且有重試功能
  • TcpServer 用于編寫(xiě)網(wǎng)絡(luò)服務(wù)器,接受客戶(hù)的連接
  • 在這些類(lèi)中,TcpConnection 的生命期依靠 shared_ptr 控制(即用戶(hù)和庫(kù)共同控制)。Buffer 的生命期由 TcpConnection 控制。其余類(lèi)的生命期由用戶(hù)控制。
  • HttpServer 和 Inspector,暴露出一個(gè) http 界面,用于監(jiān)控進(jìn)程的狀態(tài),類(lèi)似于 Java JMX。這么做的原因是,《程序員修煉之道》第 6 章第 34 條提到“對(duì)于更大、更復(fù)雜的服務(wù)器代碼,提供其操作的內(nèi)部試圖的一種漂亮技術(shù)是使用內(nèi)建的 Web 服務(wù)器”,Jeff Dean 也說(shuō)“(每個(gè) Google 的服務(wù)器進(jìn)程)Export HTML-based status pages for easy diagnosis”。
內(nèi)部實(shí)現(xiàn)
  • Channel 是 selectable IO channel,負(fù)責(zé)注冊(cè)與響應(yīng) IO 事件,它不擁有 file descriptor。它是 Acceptor、Connector、EventLoop、TimerQueue、TcpConnection 的成員,生命期由后者控制。
  • Socket 封裝一個(gè) file descriptor,并在析構(gòu)時(shí)關(guān)閉 fd。它是 Acceptor、TcpConnection 的成員,生命期由后者控制。EventLoop、TimerQueue 也擁有 fd,但是不封裝為 Socket。
  • SocketsOps 封裝各種 sockets 系統(tǒng)調(diào)用。
  • EventLoop 封裝事件循環(huán),也是事件分派的中心。它用 eventfd(2) 來(lái)異步喚醒,這有別于傳統(tǒng)的用一對(duì) pipe(2) 的辦法。它用 TimerQueue 作為計(jì)時(shí)器管理,用 Poller 作為 IO Multiplexing。
  • Poller 是 PollPoller 和 EPollPoller 的基類(lèi),采用“電平觸發(fā)”的語(yǔ)意。它是 EventLoop 的成員,生命期由后者控制。
  • PollPoller 和 EPollPoller 封裝 poll(2) 和 epoll(4) 兩種 IO Multiplexing 后端。Poll 的存在價(jià)值是便于調(diào)試,因?yàn)?poll(2) 調(diào)用是上下文無(wú)關(guān)的,用 strace 很容易知道庫(kù)的行為是否正確。
  • Connector 用于發(fā)起 TCP 連接,它是 TcpClient 的成員,生命期由后者控制。
  • Acceptor 用于接受 TCP 連接,它是 TcpServer 的成員,生命期由后者控制。
  • TimerQueue 用 timerfd 實(shí)現(xiàn)定時(shí),這有別于傳統(tǒng)的設(shè)置 poll/epoll_wait 的等待時(shí)長(zhǎng)的辦法。為了簡(jiǎn)單起見(jiàn),目前用鏈表來(lái)管理 Timer,如果有必要可改為優(yōu)先隊(duì)列,這樣復(fù)雜度可從 O(n) 降為 O(ln n) (某些操作甚至是 O(1))。它是 EventLoop 的成員,生命期由后者控制。
  • EventLoopThreadPool 用于創(chuàng)建 IO 線(xiàn)程池,也就是說(shuō)把 TcpConnection 分派到一組運(yùn)行 EventLoop 的線(xiàn)程上。它是 TcpServer 的成員,生命期由后者控制。

線(xiàn)程模型

Muduo 的線(xiàn)程模型符合我主張的 one loop per thread + thread pool 模型。每個(gè)線(xiàn)程最多有一個(gè) EventLoop。每個(gè) TcpConnection 必須歸某個(gè) EventLoop 管理,所有的 IO 會(huì)轉(zhuǎn)移到這個(gè)線(xiàn)程,換句話(huà)說(shuō)一個(gè) file descriptor 只能由一個(gè)線(xiàn)程讀寫(xiě)。TcpConnection 所在的線(xiàn)程由其所屬的 EventLoop 決定,這樣我們可以很方便地把不同的 TCP 連接放到不同的線(xiàn)程去,也可以把一些 TCP 連接放到一個(gè)線(xiàn)程里。TcpConnection 和 EventLoop 是線(xiàn)程安全的,可以跨線(xiàn)程調(diào)用。TcpServer 直接支持多線(xiàn)程,它有兩種模式:

1. 單線(xiàn)程,accept 與 TcpConnection 用同一個(gè)線(xiàn)程做 IO。

2. 多線(xiàn)程,accept 與 EventLoop 在同一個(gè)線(xiàn)程,另外創(chuàng)建一個(gè) EventLoopThreadPool,新到的連接會(huì)按 round-robin 方式分配到線(xiàn)程池中。

結(jié)語(yǔ)

Muduo 是我對(duì)常見(jiàn)網(wǎng)絡(luò)編程任務(wù)的總結(jié),用它我能很容易地編寫(xiě)多線(xiàn)程的 TCP 服務(wù)器和客戶(hù)端。Muduo 是我業(yè)余時(shí)間的作品,代碼估計(jì)還有很多 bug,功能也不完善(例如不支持 signal 處理),待日后慢慢改進(jìn)吧。

posted on 2010-08-29 23:42 陳碩 閱讀(12134) 評(píng)論(20)  編輯 收藏 引用 所屬分類(lèi): muduo

評(píng)論

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-08-30 08:25 路青飛

超贊!
有個(gè)小問(wèn)題,為什么不支持Windows呢?  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-08-30 08:56 陳碩

@路青飛
因?yàn)槲覍?duì) Windows 編程不熟。  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-08-30 09:07 expter

很好,下載學(xué)習(xí)下。。  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-08-30 09:48 dennis-zhuang

不支持udp是基于什么考慮?
timerQueue替換成優(yōu)先隊(duì)列也是O(lg(n))的復(fù)雜度吧,而不是O(1)
貌似沒(méi)有實(shí)現(xiàn)基于select的Poller。
代碼很清晰,感謝。  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-08-30 10:41 陳碩

@dennis-zhuang
> 不支持udp是基于什么考慮?
因?yàn)槲覜](méi)搞過(guò) UDP 編程,沒(méi)有一手的經(jīng)驗(yàn)。

> timerQueue替換成優(yōu)先隊(duì)列也是O(lg(n))的復(fù)雜度吧,而不是O(1)
刪除的復(fù)雜度是 O(ln n)。插入的平均復(fù)雜度是 O(1),最壞復(fù)雜度是 O(ln n)。已訂正原文,多謝。

> 貌似沒(méi)有實(shí)現(xiàn)基于select的Poller。
確實(shí),因?yàn)?select 比 poll 限制更多,有了 poll 和 epoll,沒(méi)必要再實(shí)現(xiàn) select。

> 代碼很清晰,感謝。
thanks.  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-02 12:18 梨樹(shù)陽(yáng)光

非常不錯(cuò),下來(lái)看看  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-02 23:41 chaogu

不知樓主試過(guò)沒(méi),Linux開(kāi)50個(gè)線(xiàn)程機(jī)器會(huì)很卡,windows開(kāi)50個(gè)的時(shí)候?qū)C(jī)器的運(yùn)行不影響。老實(shí)說(shuō)我不是很明白。能不能解釋一下。
Linux是用的pthread
Windows用的是win32API
會(huì)不會(huì)是我使用不對(duì)?。ú灰f(shuō)開(kāi)50個(gè)線(xiàn)程不對(duì),我只是覺(jué)得Linux的線(xiàn)程應(yīng)該比Windows好,開(kāi)相同多的線(xiàn)程應(yīng)該Linux好很多)。
老實(shí)說(shuō)Linux我還是菜鳥(niǎo)。  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 08:12 陳碩

@chaogu
我沒(méi)有遇到過(guò),你的線(xiàn)程函數(shù)長(zhǎng)什么樣?用哪種同步機(jī)制?  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù)[未登錄](méi) 2010-09-03 09:10 cppexplore

@chaogu
linux的線(xiàn)程調(diào)度比windows的差, 有資料表明,windows上線(xiàn)程的調(diào)度切換是linux上的1/30大概.
另linux可以把進(jìn)程和cpu綁定,而線(xiàn)程:低內(nèi)核的linux則沒(méi)有相關(guān)函數(shù), 2.6小版本內(nèi)核有相關(guān)函數(shù),但綁定不成功, 只有最新的linux內(nèi)核才可以。
  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 11:02 chaogu

@陳碩
函數(shù)是_beginthreadex
同步用的是WaitForSingleObject。  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 11:22 陳碩

@chaogu
Linux 下呢?有沒(méi)有 busy waiting?  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 11:26 chaogu

@陳碩
其他的是一樣的。代碼上的區(qū)別只是線(xiàn)程上的不同。
Linux上用的就是pthread,同步用的是pthread_mutex_unlock(就是加鎖)。
Windows用WaitForSingleObject也就為了加鎖。  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 12:18 陳碩

@chaogu
Linux 上用什么方式等待?  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 13:10 chaogu

@陳碩
while(true)
難道有問(wèn)題?  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 13:29 陳碩

@chaogu
循環(huán)體內(nèi)有沒(méi)有 pthread_cond_wait ? 或者貼一下代碼骨架吧。  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 16:46 chaogu

1 queue<sometype> shareQueue 2 3 main{ 4 run_server() 5 } 6 run_server{ 7 //do something init 8 .... 9 10 //create thread 11 for(int i = 0;i < pollsize;++i){ 12 pthread_attr_init(attr[i]) 13 pthread_attr_setstacksize(attr[i],1024*120) 14 threads[i] = pthread_create(threadids[i],attr[i],somefunc,args[i]) 15 } 16 17 while(true){ 18 __createShareObject__(shareObject) //Pseudo-code 19 pthread_mutex_lock(&mutex); 20 shareQuueue.push(shareObject); 21 pthread_mutex_unlock(&mutex); 22 } 23 24 //clean up 25 ..... 26 } 27 28 somefunc(){ 29 while(true){ 30 pthread_mutex_lock(&mutex); 31 if(shareQueue.size() < 1){ 32 pthead_mutex_unlock(&mutex); 33 continue; 34 }else{ 35 shareObject = shareQueue.pop(); 36 pthread_mutex_unlock(&mutex); 37 } 38 __useShareObjectDoSomething__ //pseudo-code 39 } 40 } 41 42 43 不知這樣是否能看懂,不是我的代碼要保密,而是代碼有點(diǎn)難看,
就是我看也要整半天才能看懂。這個(gè)結(jié)構(gòu)也就夠清晰了。Windows里
面的結(jié)構(gòu)是一樣的,只不過(guò)pthread的函數(shù)換成win32api
  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-03 22:32 陳碩

@chaogu
這是典型的 busy-waiting,建議改為:

19 pthread_mutex_lock(&mutex);
20 shareQuueue.push(shareObject);
++ pthread_cond_signal(&condvar);
21 pthread_mutex_unlock(&mutex);

30 pthread_mutex_lock(&mutex);
31 while (shareQueue.size() < 1){
++ pthread_cond_wait(&condvar, &mutex);
34 }
35 shareObject = shareQueue.pop();
36 pthread_mutex_unlock(&mutex);

參考:
http://github.com/chenshuo/recipes/blob/master/thread/BlockingQueue.h  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-04 21:19 cpp

std::vector<char> buffer_;
看過(guò)mangos里也是采用這個(gè)來(lái)裝buffer。
vector和char [固定長(zhǎng)度],請(qǐng)問(wèn)你認(rèn)為有什么優(yōu)勢(shì)呢?  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2010-09-04 21:27 陳碩

@cpp
vector 能伸縮唄,適合不定長(zhǎng)的消息。  回復(fù)  更多評(píng)論   

# re: 發(fā)布一個(gè)基于 Reactor 模式的 C++ 網(wǎng)絡(luò)庫(kù) 2015-11-06 22:39 孫國(guó)棟

Makefile:126: recipe for target 'all' failed
什么原因,謝謝?  回復(fù)  更多評(píng)論   

<2013年9月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(lèi)

隨筆檔案

相冊(cè)

搜索

最新評(píng)論

閱讀排行榜

評(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电影| 欧美成人影音| 久久人人97超碰人人澡爱香蕉| 亚洲美女精品成人在线视频| 久久乐国产精品| 亚洲欧美中文在线视频| 日韩一二三区视频| 亚洲高清免费在线| 国产亚洲欧美一区二区三区| 欧美视频在线观看 亚洲欧| 欧美成年网站| 美女国产一区| 久久―日本道色综合久久| 亚洲欧美国产精品桃花| 99精品视频免费观看| 亚洲高清视频一区| 欧美成人精品1314www| 久久经典综合| 久久av老司机精品网站导航| 亚洲欧美成人一区二区在线电影| 亚洲人永久免费| 亚洲国产综合在线看不卡| 永久555www成人免费| 韩日欧美一区二区| 国产综合视频| 伊人久久婷婷色综合98网| 国产在线精品一区二区夜色| 国产伦精品一区二区三区照片91| 国产精品日本欧美一区二区三区| 欧美丝袜一区二区| 国产精品久久久久久久第一福利| 欧美日韩中文另类| 国产精品久久久久久久久免费樱桃| 欧美日韩精品在线观看| 欧美吻胸吃奶大尺度电影| 欧美日韩不卡| 国产精品二区在线| 国产精品视频成人| 国产精品一卡| 国模精品一区二区三区色天香| 国户精品久久久久久久久久久不卡| 国产在线精品成人一区二区三区| 国产一区二区三区在线观看精品| 韩国福利一区| 亚洲茄子视频| 亚洲天堂av在线免费观看| 午夜国产精品影院在线观看| 久久成人18免费观看| 久久久久青草大香线综合精品| 老牛影视一区二区三区| 欧美激情亚洲| 99精品国产在热久久下载| 亚洲在线视频一区| 久久人人超碰| 欧美日本中文字幕| 国产精品一区久久| 依依成人综合视频| 一区二区欧美视频| 欧美一区二区三区久久精品茉莉花 | 亚洲国产一区二区视频| 亚洲理论在线| 欧美一区二区三区免费观看| 蜜臀av性久久久久蜜臀aⅴ| 亚洲激情亚洲| 亚洲欧美在线一区| 欧美成人久久| 国产欧美一区二区三区久久| 亚洲大片精品永久免费| 亚洲无亚洲人成网站77777| 欧美制服丝袜| 最新日韩精品| 久久国产精品99国产| 欧美人与性动交cc0o| 国产欧美成人| 亚洲免费观看视频| 久久野战av| 亚洲午夜av| 暖暖成人免费视频| 国产日韩一区二区三区在线| 亚洲精品欧洲| 久久日韩精品| 中文在线资源观看网站视频免费不卡 | 狠狠综合久久av一区二区小说 | 亚洲高清成人| 亚洲专区在线视频| 欧美国产国产综合| 午夜精品一区二区三区在线视 | 国产亚洲福利社区一区| 亚洲每日在线| 久久久夜精品| 亚洲视频中文字幕| 欧美成年网站| 狠狠综合久久| 欧美在线视频观看免费网站| 最新日韩在线视频| 久久手机精品视频| 国产九色精品成人porny| 99re亚洲国产精品| 欧美国产日产韩国视频| 欧美在线观看视频一区二区三区| 欧美日韩久久| 亚洲另类一区二区| 欧美国产日韩一二三区| 欧美一站二站| 国产日韩视频一区二区三区| 亚洲免费在线精品一区| 亚洲人成77777在线观看网| 久久五月天婷婷| 黄色精品免费| 久久久免费av| 欧美在线播放一区| 国产日本欧洲亚洲| 欧美影院一区| 亚洲欧美日韩一区二区三区在线观看| 欧美日韩91| 一区二区三区精密机械公司| 亚洲电影第1页| 麻豆精品视频在线观看| 一区二区在线免费观看| 久久久久久日产精品| 香蕉久久一区二区不卡无毒影院 | 久久精品一区四区| 午夜精品剧场| 国产色产综合色产在线视频| 欧美一区二区三区视频免费播放| 中日韩在线视频| 欧美午夜精品久久久久久超碰| 亚洲视频图片小说| 一区二区国产日产| 国产精品久久中文| 欧美一区二区三区免费看 | 久久精品盗摄| 久久精品一二三区| 亚洲国产一区二区三区a毛片| 欧美成年视频| 欧美精品日韩精品| 亚洲午夜91| 午夜精品久久久| 禁断一区二区三区在线 | 亚洲一区二区3| 国产精品永久免费视频| 久久精品国产亚洲a| 久久久蜜臀国产一区二区| 亚洲大片免费看| 亚洲精品永久免费精品| 国产精品theporn88| 欧美影院视频| 久久一区二区三区四区| 99精品欧美| 亚洲在线播放电影| 伊伊综合在线| 亚洲蜜桃精久久久久久久| 国产精品久久久999| 久久精品首页| 免费美女久久99| 亚洲五月婷婷| 久久国产一区二区| 日韩视频精品在线| 亚洲专区在线视频| 亚洲电影免费观看高清完整版在线观看 | 中文精品一区二区三区| 亚洲欧美成人一区二区在线电影| 韩国欧美一区| 亚洲人体1000| 国产亚洲欧美日韩一区二区| 亚洲第一久久影院| 国产精品欧美日韩久久| 欧美freesex8一10精品| 欧美视频国产精品| 免费久久精品视频| 欧美性猛交xxxx乱大交蜜桃 | 亚洲精品国产日韩| 国产在线精品二区| 亚洲日本在线观看| 国模精品一区二区三区| 日韩视频一区二区三区在线播放免费观看| 国产精品一区二区在线观看不卡| 欧美激情一区二区三区在线视频观看 | 中国成人亚色综合网站| 在线不卡a资源高清| 亚洲午夜精品17c| 亚洲日韩欧美视频一区| 欧美亚洲一区在线| 亚洲网友自拍| 欧美成人亚洲成人日韩成人| 欧美一区网站| 欧美日韩综合在线免费观看| 蜜臀久久99精品久久久久久9 | 美女日韩欧美| 久久av一区二区| 欧美日韩在线观看一区二区| 欧美成人资源| 黄色工厂这里只有精品| 亚洲淫性视频| 亚洲一区二区三区成人在线视频精品|