久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下select, poll和epoll IO模型的详解

發布時間:2025/3/21 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下select, poll和epoll IO模型的详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/tianmohust/article/details/6677985

?

?

一).Epoll 介紹

Epoll 可是當前在 Linux 下開發大規模并發網絡程序的熱門人選, Epoll 在 Linux2.6 內核中正式引入,和 select 相似,其實都?I/O 多路復用技術而已?,并沒有什么神秘的。其實在 Linux 下設計并發網絡程序,向來不缺少方法,比如典型的 Apache 模型( Process Per Connection ,簡稱 PPC ), TPC ( Thread Per Connection )模型,以及 select 模型和 poll 模型,那為何還要再引入? Epoll 這個東東呢?那還是有得說說的 …

二). 常用模型的缺點

如果不擺出來其他模型的缺點,怎么能對比出 Epoll 的優點呢。

① PPC/TPC 模型

這兩種模型思想類似,就是讓每一個到來的連接一邊自己做事去,別再來煩我?。只是 PPC 是為它開了一個進程,而 TPC 開了一個線程。可是別煩我是有代價的,它要時間和空間啊,連接多了之后,那么多的進程 / 線程切換,這開銷就上來了;因此這類模型能接受的最大連接數都不會高,一般在幾百個左右。

② select 模型

1. 最大并發數限制,因為一個進程所打開的 FD (文件描述符)是有限制的,由 FD_SETSIZE 設置,默認值是 1024/2048 ,因此 Select 模型的最大并發數就被相應限制了。自己改改這個 FD_SETSIZE ?想法雖好,可是先看看下面吧 …

2. 效率問題, select 每次調用都會線性掃描全部的 FD 集合,這樣效率就會呈現線性下降,把 FD_SETSIZE 改大的后果就是,大家都慢慢來,什么?都超時了。

3. 內核 / 用戶空間 內存拷貝問題,如何讓內核把 FD 消息通知給用戶空間呢?在這個問題上 select 采取了內存拷貝方法。

總結為:1.連接數受限?? 2.查找配對速度慢?3.數據由內核拷貝到用戶態

③ poll 模型

基本上效率和 select 是相同的, select 缺點的 2 和 3 它都沒有改掉。

三). Epoll 的提升

把其他模型逐個批判了一下,再來看看 Epoll 的改進之處吧,其實把 select 的缺點反過來那就是 Epoll 的優點了。

①. Epoll 沒有最大并發連接的限制,上限是最大可以打開文件的數目,這個數字一般遠大于 2048,?一般來說這個數目和系統內存關系很大?,具體數目可以 cat /proc/sys/fs/file-max 察看。

②. 效率提升, Epoll 最大的優點就在于它只管你“活躍”的連接?,而跟連接總數無關,因此在實際的網絡環境中, Epoll 的效率就會遠遠高于 select 和 poll 。

③. 內存拷貝, Epoll 在這點上使用了“共享內存?”,這個內存拷貝也省略了。

?四). Epoll 為什么高效

Epoll 的高效和其數據結構的設計是密不可分的,這個下面就會提到。

首先回憶一下 select 模型,當有 I/O 事件到來時, select 通知應用程序有事件到了快去處理,而應用程序必須輪詢所有的 FD 集合,測試每個 FD 是否有事件發生,并處理事件;代碼像下面這樣:

[cpp] view plaincopy
  • int?res?=?select(maxfd+1,?&readfds,?NULL,?NULL,?120);??
  • if?(res?>?0)??
  • {??
  • ????for?(int?i?=?0;?i?<?MAX_CONNECTION;?i++)??
  • ????{??
  • ????????if?(FD_ISSET(allConnection[i],?&readfds))??
  • ????????{??
  • ????????????handleEvent(allConnection[i]);??
  • ????????}??
  • ????}??
  • }??
  • //?if(res?==?0)?handle?timeout,?res?<?0?handle?error??
  • [cpp] view plain copy
  • int?res?=?select(maxfd+1,?&readfds,?NULL,?NULL,?120);??
  • if?(res?>?0)??
  • {??
  • ????for?(int?i?=?0;?i?<?MAX_CONNECTION;?i++)??
  • ????{??
  • ????????if?(FD_ISSET(allConnection[i],?&readfds))??
  • ????????{??
  • ????????????handleEvent(allConnection[i]);??
  • ????????}??
  • ????}??
  • }??
  • //?if(res?==?0)?handle?timeout,?res?<?0?handle?error??
  • Epoll 不僅會告訴應用程序有I/0 事件到來,還會告訴應用程序相關的信息,這些信息是應用程序填充的,因此根據這些信息應用程序就能直接定位到事件,而不必遍歷整個FD 集合。

    [cpp] view plaincopy
  • int?res?=?epoll_wait(epfd,?events,?20,?120);??
  • for?(int?i?=?0;?i?<?res;i++)??
  • {??
  • ????handleEvent(events[n]);??
  • }??
  • [cpp] view plain copy
  • int?res?=?epoll_wait(epfd,?events,?20,?120);??
  • for?(int?i?=?0;?i?<?res;i++)??
  • {??
  • ????handleEvent(events[n]);??
  • }??
  • 五). Epoll 關鍵數據結構

    前面提到 Epoll 速度快和其數據結構密不可分,其關鍵數據結構就是:

    [cpp] view plaincopy
  • struct?epoll_event?{??
  • ????__uint32_t?events;??????//?Epoll?events??
  • ????epoll_data_t?data;??????//?User?data?variable??
  • };??
  • typedef?union?epoll_data?{??
  • ????void?*ptr;??
  • ????int?fd;??
  • ????__uint32_t?u32;??
  • ????__uint64_t?u64;??
  • }?epoll_data_t;??
  • [cpp] view plain copy
  • struct?epoll_event?{??
  • ????__uint32_t?events;??????//?Epoll?events??
  • ????epoll_data_t?data;??????//?User?data?variable??
  • };??
  • typedef?union?epoll_data?{??
  • ????void?*ptr;??
  • ????int?fd;??
  • ????__uint32_t?u32;??
  • ????__uint64_t?u64;??
  • }?epoll_data_t;??
  • 可見 epoll_data 是一個 union 結構體 , 借助于它應用程序可以保存很多類型的信息 :fd 、指針等等。有了它,應用程序就可以直接定位目標了。

    六). 使用 Epoll

    既然 Epoll 相比 select 這么好,那么用起來如何呢?會不會很繁瑣啊 … 先看看下面的三個函數吧,就知道 Epoll 的易用了。?

    int?epoll_create(int?size); ?

    生成一個? Epoll 專用的文件描述符,其實是申請一個內核空間,用來存放你想關注的 socket fd 上是否發生以及發生了什么事件。 size 就是你在這個 Epoll fd 上能關注的最大 socket fd 數,大小自定,只要內存足夠。

    int?epoll_ctl(int?epfd,?int?op,?int?fd,?struct?epoll_event?*event?); ?

    控制某個? Epoll 文件描述符上的事件:注冊、修改、刪除。其中參數 epfd 是 epoll_create() 創建 Epoll 專用的文件描述符。相對于 select 模型中的 FD_SET 和 FD_CLR 宏。

    int?epoll_wait(int?epfd,struct?epoll_event?*?events,int?maxevents,int?timeout); ?

    等待 I/O 事件的發生;參數說明:

    epfd: 由?epoll_create()?生成的 Epoll 專用的文件描述符;

    epoll_event: 用于回傳代處理事件的數組;

    maxevents: 每次能處理的事件數;

    timeout: 等待 I/O 事件發生的超時值;

    返回發生事件數。

    相對于 select 模型中的 select 函數。

    七). 例子程序

    下面是一個簡單 Echo Server 的例子程序,麻雀雖小,五臟俱全,還包含了一個簡單的超時檢查機制,簡潔起見沒有做錯誤處理。

    [cpp] view plaincopy
  • //???
  • //?a?simple?echo?server?using?epoll?in?linux??
  • //???
  • //?2009-11-05??
  • //?by?sparkling??
  • //???
  • #include?<sys/socket.h>??
  • #include?<sys/epoll.h>??
  • #include?<netinet/in.h>??
  • #include?<arpa/inet.h>??
  • #include?<fcntl.h>??
  • #include?<unistd.h>??
  • #include?<stdio.h>??
  • #include?<errno.h>??
  • #include?<iostream>??
  • using?namespace?std;??
  • #define?MAX_EVENTS?500??
  • struct?myevent_s??
  • {??
  • ????int?fd;??
  • ????void?(*call_back)(int?fd,?int?events,?void?*arg);??
  • ????int?events;??
  • ????void?*arg;??
  • ????int?status;?//?1:?in?epoll?wait?list,?0?not?in??
  • ????char?buff[128];?//?recv?data?buffer??
  • ????int?len;??
  • ????long?last_active;?//?last?active?time??
  • };??
  • //?set?event??
  • void?EventSet(myevent_s?*ev,?int?fd,?void?(*call_back)(int,?int,?void*),?void?*arg)??
  • {??
  • ????ev->fd?=?fd;??
  • ????ev->call_back?=?call_back;??
  • ????ev->events?=?0;??
  • ????ev->arg?=?arg;??
  • ????ev->status?=?0;??
  • ????ev->last_active?=?time(NULL);??
  • }??
  • //?add/mod?an?event?to?epoll??
  • void?EventAdd(int?epollFd,?int?events,?myevent_s?*ev)??
  • {??
  • ????struct?epoll_event?epv?=?{0,?{0}};??
  • ????int?op;??
  • ????epv.data.ptr?=?ev;??
  • ????epv.events?=?ev->events?=?events;??
  • ????if(ev->status?==?1){??
  • ????????op?=?EPOLL_CTL_MOD;??
  • ????}??
  • ????else{??
  • ????????op?=?EPOLL_CTL_ADD;??
  • ????????ev->status?=?1;??
  • ????}??
  • ????if(epoll_ctl(epollFd,?op,?ev->fd,?&epv)?<?0)??
  • ????????printf("Event?Add?failed[fd=%d]/n",?ev->fd);??
  • ????else??
  • ????????printf("Event?Add?OK[fd=%d]/n",?ev->fd);??
  • }??
  • //?delete?an?event?from?epoll??
  • void?EventDel(int?epollFd,?myevent_s?*ev)??
  • {??
  • ????struct?epoll_event?epv?=?{0,?{0}};??
  • ????if(ev->status?!=?1)?return;??
  • ????epv.data.ptr?=?ev;??
  • ????ev->status?=?0;??
  • ????epoll_ctl(epollFd,?EPOLL_CTL_DEL,?ev->fd,?&epv);??
  • }??
  • int?g_epollFd;??
  • myevent_s?g_Events[MAX_EVENTS+1];?//?g_Events[MAX_EVENTS]?is?used?by?listen?fd??
  • void?RecvData(int?fd,?int?events,?void?*arg);??
  • void?SendData(int?fd,?int?events,?void?*arg);??
  • //?accept?new?connections?from?clients??
  • void?AcceptConn(int?fd,?int?events,?void?*arg)??
  • {??
  • ????struct?sockaddr_in?sin;??
  • ????socklen_t?len?=?sizeof(struct?sockaddr_in);??
  • ????int?nfd,?i;??
  • ????//?accept??
  • ????if((nfd?=?accept(fd,?(struct?sockaddr*)&sin,?&len))?==?-1)??
  • ????{??
  • ????????if(errno?!=?EAGAIN?&&?errno?!=?EINTR)??
  • ????????{??
  • ????????????printf("%s:?bad?accept",?__func__);??
  • ????????}??
  • ????????return;??
  • ????}??
  • ????do??
  • ????{??
  • ????????for(i?=?0;?i?<?MAX_EVENTS;?i++)??
  • ????????{??
  • ????????????if(g_Events[i].status?==?0)??
  • ????????????{??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ????????if(i?==?MAX_EVENTS)??
  • ????????{??
  • ????????????printf("%s:max?connection?limit[%d].",?__func__,?MAX_EVENTS);??
  • ????????????break;??
  • ????????}??
  • ????????//?set?nonblocking??
  • ????????if(fcntl(nfd,?F_SETFL,?O_NONBLOCK)?<?0)?break;??
  • ????????//?add?a?read?event?for?receive?data??
  • ????????EventSet(&g_Events[i],?nfd,?RecvData,?&g_Events[i]);??
  • ????????EventAdd(g_epollFd,?EPOLLIN|EPOLLET,?&g_Events[i]);??
  • ????????printf("new?conn[%s:%d][time:%d]/n",?inet_ntoa(sin.sin_addr),?ntohs(sin.sin_port),?g_Events[i].last_active);??
  • ????}while(0);??
  • }??
  • //?receive?data??
  • void?RecvData(int?fd,?int?events,?void?*arg)??
  • {??
  • ????struct?myevent_s?*ev?=?(struct?myevent_s*)arg;??
  • ????int?len;??
  • ????//?receive?data??
  • ????len?=?recv(fd,?ev->buff,?sizeof(ev->buff)-1,?0);????
  • ????EventDel(g_epollFd,?ev);??
  • ????if(len?>?0)??
  • ????{??
  • ????????ev->len?=?len;??
  • ????????ev->buff[len]?=?'/0';??
  • ????????printf("C[%d]:%s/n",?fd,?ev->buff);??
  • ????????//?change?to?send?event??
  • ????????EventSet(ev,?fd,?SendData,?ev);??
  • ????????EventAdd(g_epollFd,?EPOLLOUT|EPOLLET,?ev);??
  • ????}??
  • ????else?if(len?==?0)??
  • ????{??
  • ????????close(ev->fd);??
  • ????????printf("[fd=%d]?closed?gracefully./n",?fd);??
  • ????}??
  • ????else??
  • ????{??
  • ????????close(ev->fd);??
  • ????????printf("recv[fd=%d]?error[%d]:%s/n",?fd,?errno,?strerror(errno));??
  • ????}??
  • }??
  • //?send?data??
  • void?SendData(int?fd,?int?events,?void?*arg)??
  • {??
  • ????struct?myevent_s?*ev?=?(struct?myevent_s*)arg;??
  • ????int?len;??
  • ????//?send?data??
  • ????len?=?send(fd,?ev->buff,?ev->len,?0);??
  • ????ev->len?=?0;??
  • ????EventDel(g_epollFd,?ev);??
  • ????if(len?>?0)??
  • ????{??
  • ????????//?change?to?receive?event??
  • ????????EventSet(ev,?fd,?RecvData,?ev);??
  • ????????EventAdd(g_epollFd,?EPOLLIN|EPOLLET,?ev);??
  • ????}??
  • ????else??
  • ????{??
  • ????????close(ev->fd);??
  • ????????printf("recv[fd=%d]?error[%d]/n",?fd,?errno);??
  • ????}??
  • }??
  • void?InitListenSocket(int?epollFd,?short?port)??
  • {??
  • ????int?listenFd?=?socket(AF_INET,?SOCK_STREAM,?0);??
  • ????fcntl(listenFd,?F_SETFL,?O_NONBLOCK);?//?set?non-blocking??
  • ????printf("server?listen?fd=%d/n",?listenFd);??
  • ????EventSet(&g_Events[MAX_EVENTS],?listenFd,?AcceptConn,?&g_Events[MAX_EVENTS]);??
  • ????//?add?listen?socket??
  • ????EventAdd(epollFd,?EPOLLIN|EPOLLET,?&g_Events[MAX_EVENTS]);??
  • ????//?bind?&?listen??
  • ????sockaddr_in?sin;??
  • ????bzero(&sin,?sizeof(sin));??
  • ????sin.sin_family?=?AF_INET;??
  • ????sin.sin_addr.s_addr?=?INADDR_ANY;??
  • ????sin.sin_port?=?htons(port);??
  • ????bind(listenFd,?(const?sockaddr*)&sin,?sizeof(sin));??
  • ????listen(listenFd,?5);??
  • }??
  • int?main(int?argc,?char?**argv)??
  • {??
  • ????short?port?=?12345;?//?default?port??
  • ????if(argc?==?2){??
  • ????????port?=?atoi(argv[1]);??
  • ????}??
  • ????//?create?epoll??
  • ????g_epollFd?=?epoll_create(MAX_EVENTS);??
  • ????if(g_epollFd?<=?0)?printf("create?epoll?failed.%d/n",?g_epollFd);??
  • ????//?create?&?bind?listen?socket,?and?add?to?epoll,?set?non-blocking??
  • ????InitListenSocket(g_epollFd,?port);??
  • ????//?event?loop??
  • ????struct?epoll_event?events[MAX_EVENTS];??
  • ????printf("server?running:port[%d]/n",?port);??
  • ????int?checkPos?=?0;??
  • ????while(1){??
  • ????????//?a?simple?timeout?check?here,?every?time?100,?better?to?use?a?mini-heap,?and?add?timer?event??
  • ????????long?now?=?time(NULL);??
  • ????????for(int?i?=?0;?i?<?100;?i++,?checkPos++)?//?doesn't?check?listen?fd??
  • ????????{??
  • ????????????if(checkPos?==?MAX_EVENTS)?checkPos?=?0;?//?recycle??
  • ????????????if(g_Events[checkPos].status?!=?1)?continue;??
  • ????????????long?duration?=?now?-?g_Events[checkPos].last_active;??
  • ????????????if(duration?>=?60)?//?60s?timeout??
  • ????????????{??
  • ????????????????close(g_Events[checkPos].fd);??
  • ????????????????printf("[fd=%d]?timeout[%d--%d]./n",?g_Events[checkPos].fd,?g_Events[checkPos].last_active,?now);??
  • ????????????????EventDel(g_epollFd,?&g_Events[checkPos]);??
  • ????????????}??
  • ????????}??
  • ????????//?wait?for?events?to?happen??
  • ????????int?fds?=?epoll_wait(g_epollFd,?events,?MAX_EVENTS,?1000);??
  • ????????if(fds?<?0){??
  • ????????????printf("epoll_wait?error,?exit/n");??
  • ????????????break;??
  • ????????}??
  • ????????for(int?i?=?0;?i?<?fds;?i++){??
  • ????????????myevent_s?*ev?=?(struct?myevent_s*)events[i].data.ptr;??
  • ????????????if((events[i].events&EPOLLIN)&&(ev->events&EPOLLIN))?//?read?event??
  • ????????????{??
  • ????????????????ev->call_back(ev->fd,?events[i].events,?ev->arg);??
  • ????????????}??
  • ????????????if((events[i].events&EPOLLOUT)&&(ev->events&EPOLLOUT))?//?write?event??
  • ????????????{??
  • ????????????????ev->call_back(ev->fd,?events[i].events,?ev->arg);??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????//?free?resource??
  • ????return?0;??
  • }???
  • [cpp] view plain copy
  • //???
  • //?a?simple?echo?server?using?epoll?in?linux??
  • //???
  • //?2009-11-05??
  • //?by?sparkling??
  • //???
  • #include?<sys/socket.h>??
  • #include?<sys/epoll.h>??
  • #include?<netinet/in.h>??
  • #include?<arpa/inet.h>??
  • #include?<fcntl.h>??
  • #include?<unistd.h>??
  • #include?<stdio.h>??
  • #include?<errno.h>??
  • #include?<iostream>??
  • using?namespace?std;??
  • #define?MAX_EVENTS?500??
  • struct?myevent_s??
  • {??
  • ????int?fd;??
  • ????void?(*call_back)(int?fd,?int?events,?void?*arg);??
  • ????int?events;??
  • ????void?*arg;??
  • ????int?status;?//?1:?in?epoll?wait?list,?0?not?in??
  • ????char?buff[128];?//?recv?data?buffer??
  • ????int?len;??
  • ????long?last_active;?//?last?active?time??
  • };??
  • //?set?event??
  • void?EventSet(myevent_s?*ev,?int?fd,?void?(*call_back)(int,?int,?void*),?void?*arg)??
  • {??
  • ????ev->fd?=?fd;??
  • ????ev->call_back?=?call_back;??
  • ????ev->events?=?0;??
  • ????ev->arg?=?arg;??
  • ????ev->status?=?0;??
  • ????ev->last_active?=?time(NULL);??
  • }??
  • //?add/mod?an?event?to?epoll??
  • void?EventAdd(int?epollFd,?int?events,?myevent_s?*ev)??
  • {??
  • ????struct?epoll_event?epv?=?{0,?{0}};??
  • ????int?op;??
  • ????epv.data.ptr?=?ev;??
  • ????epv.events?=?ev->events?=?events;??
  • ????if(ev->status?==?1){??
  • ????????op?=?EPOLL_CTL_MOD;??
  • ????}??
  • ????else{??
  • ????????op?=?EPOLL_CTL_ADD;??
  • ????????ev->status?=?1;??
  • ????}??
  • ????if(epoll_ctl(epollFd,?op,?ev->fd,?&epv)?<?0)??
  • ????????printf("Event?Add?failed[fd=%d]/n",?ev->fd);??
  • ????else??
  • ????????printf("Event?Add?OK[fd=%d]/n",?ev->fd);??
  • }??
  • //?delete?an?event?from?epoll??
  • void?EventDel(int?epollFd,?myevent_s?*ev)??
  • {??
  • ????struct?epoll_event?epv?=?{0,?{0}};??
  • ????if(ev->status?!=?1)?return;??
  • ????epv.data.ptr?=?ev;??
  • ????ev->status?=?0;??
  • ????epoll_ctl(epollFd,?EPOLL_CTL_DEL,?ev->fd,?&epv);??
  • }??
  • int?g_epollFd;??
  • myevent_s?g_Events[MAX_EVENTS+1];?//?g_Events[MAX_EVENTS]?is?used?by?listen?fd??
  • void?RecvData(int?fd,?int?events,?void?*arg);??
  • void?SendData(int?fd,?int?events,?void?*arg);??
  • //?accept?new?connections?from?clients??
  • void?AcceptConn(int?fd,?int?events,?void?*arg)??
  • {??
  • ????struct?sockaddr_in?sin;??
  • ????socklen_t?len?=?sizeof(struct?sockaddr_in);??
  • ????int?nfd,?i;??
  • ????//?accept??
  • ????if((nfd?=?accept(fd,?(struct?sockaddr*)&sin,?&len))?==?-1)??
  • ????{??
  • ????????if(errno?!=?EAGAIN?&&?errno?!=?EINTR)??
  • ????????{??
  • ????????????printf("%s:?bad?accept",?__func__);??
  • ????????}??
  • ????????return;??
  • ????}??
  • ????do??
  • ????{??
  • ????????for(i?=?0;?i?<?MAX_EVENTS;?i++)??
  • ????????{??
  • ????????????if(g_Events[i].status?==?0)??
  • ????????????{??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ????????if(i?==?MAX_EVENTS)??
  • ????????{??
  • ????????????printf("%s:max?connection?limit[%d].",?__func__,?MAX_EVENTS);??
  • ????????????break;??
  • ????????}??
  • ????????//?set?nonblocking??
  • ????????if(fcntl(nfd,?F_SETFL,?O_NONBLOCK)?<?0)?break;??
  • ????????//?add?a?read?event?for?receive?data??
  • ????????EventSet(&g_Events[i],?nfd,?RecvData,?&g_Events[i]);??
  • ????????EventAdd(g_epollFd,?EPOLLIN|EPOLLET,?&g_Events[i]);??
  • ????????printf("new?conn[%s:%d][time:%d]/n",?inet_ntoa(sin.sin_addr),?ntohs(sin.sin_port),?g_Events[i].last_active);??
  • ????}while(0);??
  • }??
  • //?receive?data??
  • void?RecvData(int?fd,?int?events,?void?*arg)??
  • {??
  • ????struct?myevent_s?*ev?=?(struct?myevent_s*)arg;??
  • ????int?len;??
  • ????//?receive?data??
  • ????len?=?recv(fd,?ev->buff,?sizeof(ev->buff)-1,?0);????
  • ????EventDel(g_epollFd,?ev);??
  • ????if(len?>?0)??
  • ????{??
  • ????????ev->len?=?len;??
  • ????????ev->buff[len]?=?'/0';??
  • ????????printf("C[%d]:%s/n",?fd,?ev->buff);??
  • ????????//?change?to?send?event??
  • ????????EventSet(ev,?fd,?SendData,?ev);??
  • ????????EventAdd(g_epollFd,?EPOLLOUT|EPOLLET,?ev);??
  • ????}??
  • ????else?if(len?==?0)??
  • ????{??
  • ????????close(ev->fd);??
  • ????????printf("[fd=%d]?closed?gracefully./n",?fd);??
  • ????}??
  • ????else??
  • ????{??
  • ????????close(ev->fd);??
  • ????????printf("recv[fd=%d]?error[%d]:%s/n",?fd,?errno,?strerror(errno));??
  • ????}??
  • }??
  • //?send?data??
  • void?SendData(int?fd,?int?events,?void?*arg)??
  • {??
  • ????struct?myevent_s?*ev?=?(struct?myevent_s*)arg;??
  • ????int?len;??
  • ????//?send?data??
  • ????len?=?send(fd,?ev->buff,?ev->len,?0);??
  • ????ev->len?=?0;??
  • ????EventDel(g_epollFd,?ev);??
  • ????if(len?>?0)??
  • ????{??
  • ????????//?change?to?receive?event??
  • ????????EventSet(ev,?fd,?RecvData,?ev);??
  • ????????EventAdd(g_epollFd,?EPOLLIN|EPOLLET,?ev);??
  • ????}??
  • ????else??
  • ????{??
  • ????????close(ev->fd);??
  • ????????printf("recv[fd=%d]?error[%d]/n",?fd,?errno);??
  • ????}??
  • }??
  • void?InitListenSocket(int?epollFd,?short?port)??
  • {??
  • ????int?listenFd?=?socket(AF_INET,?SOCK_STREAM,?0);??
  • ????fcntl(listenFd,?F_SETFL,?O_NONBLOCK);?//?set?non-blocking??
  • ????printf("server?listen?fd=%d/n",?listenFd);??
  • ????EventSet(&g_Events[MAX_EVENTS],?listenFd,?AcceptConn,?&g_Events[MAX_EVENTS]);??
  • ????//?add?listen?socket??
  • ????EventAdd(epollFd,?EPOLLIN|EPOLLET,?&g_Events[MAX_EVENTS]);??
  • ????//?bind?&?listen??
  • ????sockaddr_in?sin;??
  • ????bzero(&sin,?sizeof(sin));??
  • ????sin.sin_family?=?AF_INET;??
  • ????sin.sin_addr.s_addr?=?INADDR_ANY;??
  • ????sin.sin_port?=?htons(port);??
  • ????bind(listenFd,?(const?sockaddr*)&sin,?sizeof(sin));??
  • ????listen(listenFd,?5);??
  • }??
  • int?main(int?argc,?char?**argv)??
  • {??
  • ????short?port?=?12345;?//?default?port??
  • ????if(argc?==?2){??
  • ????????port?=?atoi(argv[1]);??
  • ????}??
  • ????//?create?epoll??
  • ????g_epollFd?=?epoll_create(MAX_EVENTS);??
  • ????if(g_epollFd?<=?0)?printf("create?epoll?failed.%d/n",?g_epollFd);??
  • ????//?create?&?bind?listen?socket,?and?add?to?epoll,?set?non-blocking??
  • ????InitListenSocket(g_epollFd,?port);??
  • ????//?event?loop??
  • ????struct?epoll_event?events[MAX_EVENTS];??
  • ????printf("server?running:port[%d]/n",?port);??
  • ????int?checkPos?=?0;??
  • ????while(1){??
  • ????????//?a?simple?timeout?check?here,?every?time?100,?better?to?use?a?mini-heap,?and?add?timer?event??
  • ????????long?now?=?time(NULL);??
  • ????????for(int?i?=?0;?i?<?100;?i++,?checkPos++)?//?doesn't?check?listen?fd??
  • ????????{??
  • ????????????if(checkPos?==?MAX_EVENTS)?checkPos?=?0;?//?recycle??
  • ????????????if(g_Events[checkPos].status?!=?1)?continue;??
  • ????????????long?duration?=?now?-?g_Events[checkPos].last_active;??
  • ????????????if(duration?>=?60)?//?60s?timeout??
  • ????????????{??
  • ????????????????close(g_Events[checkPos].fd);??
  • ????????????????printf("[fd=%d]?timeout[%d--%d]./n",?g_Events[checkPos].fd,?g_Events[checkPos].last_active,?now);??
  • ????????????????EventDel(g_epollFd,?&g_Events[checkPos]);??
  • ????????????}??
  • ????????}??
  • ????????//?wait?for?events?to?happen??
  • ????????int?fds?=?epoll_wait(g_epollFd,?events,?MAX_EVENTS,?1000);??
  • ????????if(fds?<?0){??
  • ????????????printf("epoll_wait?error,?exit/n");??
  • ????????????break;??
  • ????????}??
  • ????????for(int?i?=?0;?i?<?fds;?i++){??
  • ????????????myevent_s?*ev?=?(struct?myevent_s*)events[i].data.ptr;??
  • ????????????if((events[i].events&EPOLLIN)&&(ev->events&EPOLLIN))?//?read?event??
  • ????????????{??
  • ????????????????ev->call_back(ev->fd,?events[i].events,?ev->arg);??
  • ????????????}??
  • ????????????if((events[i].events&EPOLLOUT)&&(ev->events&EPOLLOUT))?//?write?event??
  • ????????????{??
  • ????????????????ev->call_back(ev->fd,?events[i].events,?ev->arg);??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????//?free?resource??
  • ????return?0;??
  • }???
  • ?

    3、epoll
    3.1、poll(select)的限制
    ????? Poll函數起源于SVR3,最初局限于流設備,SVR4取消了這種限制。總是來說,poll比select要高效一些,但是,它有可移植性問題,例如,windows就只支持select。
    一個poll的簡單例子:

    ?

    代碼 #include?<stdio.h>
    #include?
    <unistd.h>
    #include?
    <sys/poll.h>
    #define?TIMEOUT?5???????/*?poll?timeout,?in?seconds?*/
    int?main?(void)
    {
    ????????
    struct?pollfd?fds[2];
    ????????
    int?ret;
    ????????
    /*?watch?stdin?for?input?*/
    ????????fds[
    0].fd?=?STDIN_FILENO;
    ????????fds[
    0].events?=?POLLIN;
    ????????
    /*?watch?stdout?for?ability?to?write?(almost?always?true)?*/
    ????????fds[
    1].fd?=?STDOUT_FILENO;
    ????????fds[
    1].events?=?POLLOUT;
    ????????
    /*?All?set,?block!?*/
    ????????ret?
    =?poll?(fds,?2,?TIMEOUT?*?1000);
    ????????
    if?(ret?==?-1)?{
    ????????????????perror?(
    "poll");
    ????????????????
    return?1;
    ????????}
    ????????
    if?(!ret)?{
    ????????????????printf?(
    "%d?seconds?elapsed.\n",?TIMEOUT);
    ????????????????
    return?0;
    ????????}
    ????????
    if?(fds[0].revents?&?POLLIN)
    ????????????????printf?(
    "stdin?is?readable\n");
    ????????
    if?(fds[1].revents?&?POLLOUT)
    ????????????????printf?(
    "stdout?is?writable\n");
    ????????
    return?0;
    }

    ?

    ?

    ???? select模型與此類例。內核必須遍歷所有監視的描述符,而應用程序也必須遍歷所有描述符,檢查哪些描述符已經準備好。當描述符成百上千時,會變得非常低效——這是select(poll)模型低效的根源所在。考慮這些情況,2.6以后的內核都引進了epoll模型。

    3.2、核心數據結構與接口
    Epoll模型由3個函數構成,epoll_create、epoll_ctl和epoll_wait。
    3.2.1創建epoll實例(Creating a New Epoll Instance)
    ???? epoll環境通過epoll_create函數創建:
    ???? #include <sys/epoll.h>
    ????? int epoll_create (int size)
    ????? 調用成功則返回與實例關聯的文件描述符,該文件描述符與真實的文件沒有任何關系,僅作為接下來調用的函數的句柄。size是給內核的一個提示,告訴內核將要監視的文件描述符的數量,它不是最大值;但是,傳遞合適的值能夠提高系統性能。發生錯誤時,返回-1。
    例子:

    ?

    int?epfd;
    epfd?
    =?epoll_create?(100);??/*?plan?to?watch?~100?fds?*/
    if?(epfd?<?0)
    ????????perror?(
    "epoll_create");

    ?

    3.2.2、控制epoll(Controlling Epoll)
    通過epoll_ctl,可以加入文件描述符到epoll環境或從epoll環境移除文件描述符。

    ?

    代碼 #include?<sys/epoll.h>
    int?epoll_ctl?(int?epfd,
    ???????????????
    int?op,
    ???????????????
    int?fd,
    ???????????????
    struct?epoll_event?*event);

    struct?epoll_event?{
    ????????_?_u32?events;??
    /*?events?*/
    ????????union?{
    ????????????????
    void?*ptr;
    ????????????????
    int?fd;
    ????????????????_?_u32?u32;
    ????????????????_?_u64?u64;
    ????????}?data;
    };

    ?

    ?

    ?

    ?

    epfd為epoll_create返回的描述符。op表示對描述符fd采取的操作,取值如下:
    EPOLL_CTL_ADD
    Add a monitor on the file associated with the file descriptor fd to the epoll instance associated with epfd, per the events defined in event.

    EPOLL_CTL_DEL
    Remove a monitor on the file associated with the file descriptor fd from the epollinstance associated with epfd.
    EPOLL_CTL_MOD
    Modify an existing monitor of fd with the updated events specified by event.

    epoll_event結構中的events字段,表示對該文件描述符所關注的事件,它的取值如下:
    EPOLLET
    Enables edge-triggered behavior for the monitor of the file .The default behavior is level-
    triggered.
    EPOLLHUP
    A hangup occurred on the file. This event is always monitored, even if it’s not specified.
    EPOLLIN
    The file is available to be read from without blocking.
    EPOLLONESHOT
    After an event is generated and read, the file is automatically no longer monitored.A new event mask must be specified via EPOLL_CTL_MOD to reenable the watch.
    EPOLLOUT
    The file is available to be written to without blocking.
    EPOLLPRI
    There is urgent out-of-band data available to read.
    而epoll_event結構中的fd是epoll高效的根源所在,當描述符準備好。應用程序不用遍歷所有描述符,而只用檢查發生事件的描述符。
    將一個描述符加入epoll環境:

    ?

    代碼 struct?epoll_event?event;
    int?ret;
    event.data.fd?=?fd;?/*?return?the?fd?to?us?later?*/
    event.events?=?EPOLLIN?|?EPOLLOUT;
    ret?
    =?epoll_ctl?(epfd,?EPOLL_CTL_ADD,?fd,?&event);
    if?(ret)
    ????????perror?(
    "epoll_ctl");

    ?

    ?

    ?

    3.2.3、等待事件(Waiting for Events with Epoll)

    #include <sys/epoll.h>
    int epoll_wait (int epfd,
    ??????????????? struct epoll_event *events,
    ??????????????? int maxevents,
    ??????????????? int timeout);
    等待事件的產生,類似于select()調用。參數events用來從內核得到事件的集合,maxevents告之內核這個events有多大,這個 maxevents的值不能大于創建epoll_create()時的size,參數timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有 說法說是永久阻塞)。該函數返回需要處理的事件數目,如返回0表示已超時。
    一個簡單示例:

    ?

    代碼 #define?MAX_EVENTS????64
    struct?epoll_event?*events;
    int?nr_events,?i,?epfd;
    events?
    =?malloc?(sizeof?(struct?epoll_event)?*?MAX_EVENTS);
    if?(!events)?{
    ????????perror?(
    "malloc");
    ????????
    return?1;
    }
    nr_events?
    =?epoll_wait?(epfd,?events,?MAX_EVENTS,?-1);
    if?(nr_events?<?0)?{
    ????????perror?(
    "epoll_wait");
    ????????free?(events);
    ????????
    return?1;
    }
    //只需要檢查發生事件的文件描述符,而不需要遍歷所有描述符
    for?(i?=?0;?i?<?nr_events;?i++)?{
    ????????printf?(
    "event=%ld?on?fd=%d\n",
    ????????????????events[i].events,
    ????????????????events[i].data.fd);
    ????????
    /*
    ?????????*?We?now?can,?per?events[i].events,?operate?on
    ?????????*?events[i].data.fd?without?blocking.
    ?????????
    */
    }
    free?(events);

    ?

    ?

    3.2.4、epoll的典型用法

    ?

    代碼 struct?epoll_event?ev,?*events;
    for(;;)?{
    ????nfds?
    =?epoll_wait(kdpfd,?events,?maxevents,?-1);
    ????
    for(n?=?0;?n?<?nfds;?++n)?{
    ????????
    if(events[n].data.fd?==?listener)?{
    ????????????
    //新的連接
    ????????????client?=?accept(listener,?(struct?sockaddr?*)?&local,
    ????????????????????????????
    &addrlen);
    ????????????
    if(client?<?0){
    ????????????????perror(
    "accept");
    ????????????????
    continue;
    ????????????}
    ????????????setnonblocking(client);
    ????????????ev.events?
    =?EPOLLIN?|?EPOLLET;
    ????????????ev.data.fd?
    =?client;
    ????????
    //?設置好event之后,將這個新的event通過epoll_ctl加入到epoll的監聽隊列里面
    ????????????if?(epoll_ctl(kdpfd,?EPOLL_CTL_ADD,?client,?&ev)?<?0)?{
    ????????????????fprintf(stderr,?
    "epoll?set?insertion?error:?fd=%d0,
    ????????????????????????client);
    ????????????????
    return?-1;
    ????????????}
    ????????}
    ????????
    else
    ????????????do_use_fd(events[n].data.fd);
    ????}
    }

    ?

    ?

    3.3、綜合示例

    ?

    代碼 //echo_epoll_server.c
    #include?"echo.h"
    #include?
    <sys/epoll.h>
    #include?
    <fcntl.h>

    #define?EVENT_ARR_SIZE?20
    #define?EPOLL_SIZE?????20

    void?setnonblocking(
    ????
    int?sockfd
    );

    int
    main(
    int?argc,?char?**argv)
    {
    ????
    int????????i,??listenfd,?connfd,?sockfd,?epfd;
    ????ssize_t????????n;
    ????
    char????????????buf[MAXLINE];
    ????socklen_t????????clilen;
    ????
    struct?sockaddr_in????cliaddr,?servaddr;
    ????
    struct?epoll_event?ev,?evs[EVENT_ARR_SIZE];
    ????
    int???nfds;

    ????
    if((listenfd?=?socket(AF_INET,?SOCK_STREAM,?0))?<?0)
    ????????err_sys(
    "create?socket?error!\n");
    ????setnonblocking(listenfd);

    ????epfd?
    =?epoll_create(EPOLL_SIZE);
    ????ev.data.fd?
    =?listenfd;
    ????ev.events?
    =?EPOLLIN?|?EPOLLET;
    ????
    if(epoll_ctl(epfd,?EPOLL_CTL_ADD,?listenfd,?&ev)?<?0)
    ????????err_sys(
    "epoll_ctl?listenfd?error!\n");
    ????
    ????bzero(
    &servaddr,?sizeof(servaddr));
    ????servaddr.sin_family??????
    =?AF_INET;
    ????
    //servaddr.sin_addr.s_addr?=?INADDR_ANY;
    ????servaddr.sin_addr.s_addr?=?inet_addr("211.67.28.128");
    ????servaddr.sin_port????????
    =?htons(SERV_PORT);

    ????
    if(bind(listenfd,?(struct?sockaddr*)?&servaddr,?sizeof(servaddr))?<?0)
    ????????err_sys(
    "bind?error!\n");

    ????
    if(listen(listenfd,?LISTENQ)?<?0)
    ????????err_sys(
    "listen?error!\n");

    ????printf(
    "server?is?listening....\n");

    ????
    for?(?;?;?)?{
    ????????
    if((nfds?=?epoll_wait(epfd,?evs,?EVENT_ARR_SIZE,?-1))?<?0)
    ????????????err_sys(
    "epoll_wait?error!\n");

    ????????
    for(i?=?0;?i?<?nfds;?i++)
    ????????{
    ????????????????
    if(evs[i].data.fd?==?listenfd)
    ????????????????{
    ????????????????????clilen?
    =?sizeof(cliaddr);
    ????????????????????connfd?
    =?accept(listenfd,?(struct?sockaddr*)?&cliaddr,?&clilen);
    ????????????????????
    if(connfd?<?0)
    ????????????????????????
    continue;
    ????????????????????????
    ????????????????????setnonblocking(connfd);
    ????????????????????ev.data.fd?
    =?connfd;
    ????????????????????ev.events?
    =?EPOLLIN?|?EPOLLET;
    ????????????????????
    if?(epoll_ctl(epfd,?EPOLL_CTL_ADD,?connfd,?&ev)?<?0)
    ????????????????????????err_sys(
    "epoll_ctl?connfd?error!\n");????????????
    ????????????????}
    ????????????????
    else?if(evs[i].events?&?EPOLLIN)
    ????????????????{
    ????????????????????sockfd?
    =?evs[i].data.fd;
    ????????????????????
    if?(sockfd?<?0)
    ????????????????????????
    continue;
    ????????????????????
    if?(?(n?=?read(sockfd,?buf,?MAXLINE))?==?0)?{
    ????????????????????????epoll_ctl(epfd,?EPOLL_CTL_DEL,?sockfd,?
    &ev);
    ????????????????????????close(sockfd);
    ????????????????????????evs[i].data.fd?
    =?-1;
    ????????????????????}?
    ????????????????????
    else?if(n?<?0)
    ????????????????????????err_sys(
    "read?socket?error!\n");
    ????????????????????
    else
    ????????????????????{
    ????????????????????????printf(
    "write?%d?bytes\n",?n);
    ????????????????????????write(sockfd,?buf,?n);
    ????????????????????}
    ????????????????}
    ????????????????
    else
    ????????????????????printf(
    "other?event!\n");
    ????????}
    ????}
    ????
    return?0;
    }


    void?setnonblocking(
    ????
    int?sockfd
    )
    {
    ????
    int?flag;
    ????
    ????flag?
    =?fcntl(sockfd,?F_GETFL);
    ????
    if(flag?<?0)
    ????????????err_sys(
    "fcnt(F_GETFL)?error!\n");
    ????flag?
    |=?O_NONBLOCK;
    ????
    if(fcntl(sockfd,?F_SETFL,?flag)?<?0)
    ????????err_sys(
    "fcon(F_SETFL)?error!\n");
    }

    //echo.h
    #include?<sys/types.h>
    #include?
    <sys/socket.h>
    #include?
    <netinet/in.h>
    #include?
    <arpa/inet.h>

    #include?
    <unistd.h>
    #include?
    <stdlib.h>
    #include?
    <string.h>
    #include?
    <stdio.h>
    #include?
    <errno.h>


    #define?SERV_PORT?????9877
    #define?MAXLINE????????4096
    #define?LISTENQ????????5

    void
    err_sys(
    const?char?*fmt,?...);

    ssize_t????????????????????????
    readn(
    int?fd,?void?*vptr,?size_t?n);

    ?



    補充部分:

    select()系統調用提供一個機制來實現同步多元I/O:

    ?

    #include?<sys/time.h>
    #include?<sys/types.h>
    #include?<unistd.h>

    int?select?(int?n,
    fd_set?*readfds,
    fd_set?*writefds,
    fd_set?*exceptfds,
    struct?timeval?*timeout);

    FD_CLR(int?fd,?fd_set?*set);
    FD_ISSET(int?fd,?fd_set?*set);
    FD_SET(int?fd,?fd_set?*set);
    FD_ZERO(fd_set?*set);


    調用select()將阻塞,直到指定的文件描述符準備好執行I/O,或者可選參數timeout指定的時間已經過去。
    監視的文件描述符分為三類set,每一種對應等待不同的事件。readfds中列出的文件描述符被監視是否有數據可供讀取(如果讀取操作完成則不會阻塞)。writefds中列出的文件描述符則被監視是否寫入操作完成而不阻塞。最后,exceptfds中列出的文件描述符則被監視是否發生異常,或者無法控制的數據是否可用(這些狀態僅僅應用于套接字)。這三類set可以是NULL,這種情況下select()不監視這一類事件。
    select()成功返回時,每組set都被修改以使它只包含準備好I/O的文件描述符。例如,假設有兩個文件描述符,值分別是7和9,被放在readfds中。當select()返回時,如果7仍然在set中,則這個文件描述符已經準備好被讀取而不會阻塞。如果9已經不在set中,則讀取它將可能會阻塞(我說可能是因為數據可能正好在select返回后就可用,這種情況下,下一次調用select()將返回文件描述符準備好讀取)。
    第一個參數n,等于所有set中最大的那個文件描述符的值加1。因此,select()的調用者負責檢查哪個文件描述符擁有最大值,并且把這個值加1再傳遞給第一個參數。
    timeout參數是一個指向timeval結構體的指針,timeval定義如下:

    #include?<sys/time.h>
    struct?timeval?{
    long?tv_sec;?/* seconds */
    long?tv_usec;?/*?10E-6 second?*/
    };


    如果這個參數不是NULL,則即使沒有文件描述符準備好I/O,select()也會在經過tv_sec秒和tv_usec微秒后返回。當select()返回時,timeout參數的狀態在不同的系統中是未定義的,因此每次調用select()之前必須重新初始化timeout和文件描述符set。實際上,當前版本的Linux會自動修改timeout參數,設置它的值為剩余時間。因此,如果timeout被設置為5秒,然后在文件描述符準備好之前經過了3秒,則這一次調用select()返回時tv_sec將變為2。
    如果timeout中的兩個值都設置為0,則調用select()將立即返回,報告調用時所有未決的事件,但不等待任何隨后的事件。
    文件描述符set不會直接操作,一般使用幾個助手宏來管理。這允許Unix系統以自己喜歡的方式來實現文件描述符set。但大多數系統都簡單地實現set為位數組。FD_ZERO移除指定set中的所有文件描述符。每一次調用select()之前都應該先調用它。
    fd_set writefds;
    FD_ZERO(&writefds);
    FD_SET添加一個文件描述符到指定的set中,FD_CLR則從指定的set中移除一個文件描述符:
    FD_SET(fd, &writefds); /* add 'fd' to the set */
    FD_CLR(fd, &writefds); /* oops, remove 'fd' from the set */
    設計良好的代碼應該永遠不使用FD_CLR,而且實際情況中它也確實很少被使用。
    FD_ISSET測試一個文件描述符是否指定set的一部分。如果文件描述符在set中則返回一個非0整數,不在則返回0。FD_ISSET在調用select()返回之后使用,測試指定的文件描述符是否準備好相關動作:
    if (FD_ISSET(fd, &readfds))
    /* 'fd' is readable without blocking! */
    因為文件描述符set是靜態創建的,它們對文件描述符的最大數目強加了一個限制,能夠放進set中的最大文件描述符的值由FD_SETSIZE指定。在Linux中,這個值是1024。本章后面我們還將看到這個限制的衍生物。
    返回值和錯誤代碼
    select()成功時返回準備好I/O的文件描述符數目,包括所有三個set。如果提供了timeout,返回值可能是0;錯誤時返回-1,并且設置errno為下面幾個值之一:
    EBADF,給某個set提供了無效文件描述符。
    EINTR,等待時捕獲到信號,可以重新發起調用。
    EINVAL,參數n為負數,或者指定的timeout非法。
    ENOMEM,不夠可用內存來完成請求。
    --------------------------------------------------------------------------------------------------------------

    poll()系統調用是System V的多元I/O解決方案。它解決了select()的幾個不足,盡管select()仍然經常使用(多數還是出于習慣,或者打著可移植的名義):

    ?

    #include?<sys/poll.h>
    int?poll?(struct?pollfd?*fds,?unsigned?int?nfds,?int?timeout);


    和select()不一樣,poll()沒有使用低效的三個基于位的文件描述符set,而是采用了一個單獨的結構體pollfd數組,由fds指針指向這個組。pollfd結構體定義如下:

    #include?<sys/poll.h>

    struct?pollfd?{
    int?fd;?/* file descriptor */
    short?events;?/* requested events to watch */
    short?revents;?/* returned events witnessed */
    };


    每一個pollfd結構體指定了一個被監視的文件描述符,可以傳遞多個結構體,指示poll()監視多個文件描述符。每個結構體的events域是監視該文件描述符的事件掩碼,由用戶來設置這個域。revents域是文件描述符的操作結果事件掩碼。內核在調用返回時設置這個域。events域中請求的任何事件都可能在revents域中返回。合法的事件如下:
    POLLIN,有數據可讀。
    POLLRDNORM,有普通數據可讀。
    POLLRDBAND,有優先數據可讀。
    POLLPRI,有緊迫數據可讀。
    POLLOUT,寫數據不會導致阻塞。
    POLLWRNORM,寫普通數據不會導致阻塞。
    POLLWRBAND,寫優先數據不會導致阻塞。
    POLLMSG,SIGPOLL消息可用。
    此外,revents域中還可能返回下列事件:
    POLLER,指定的文件描述符發生錯誤。
    POLLHUP,指定的文件描述符掛起事件。
    POLLNVAL,指定的文件描述符非法。
    這些事件在events域中無意義,因為它們在合適的時候總是會從revents中返回。使用poll()和select()不一樣,你不需要顯式地請求異常情況報告。POLLIN | POLLPRI等價于select()的讀事件,POLLOUT | POLLWRBAND等價于select()的寫事件。POLLIN等價于POLLRDNORM | POLLRDBAND,而POLLOUT則等價于POLLWRNORM。
    例如,要同時監視一個文件描述符是否可讀和可寫,我們可以設置events為POLLIN | POLLOUT。在poll返回時,我們可以檢查revents中的標志,對應于文件描述符請求的events結構體。如果POLLIN事件被設置,則文件描述符可以被讀取而不阻塞。如果POLLOUT被設置,則文件描述符可以寫入而不導致阻塞。這些標志并不是互斥的:它們可能被同時設置,表示這個文件描述符的讀取和寫入操作都會正常返回而不阻塞。timeout參數指定等待的毫秒數,無論I/O是否準備好,poll都會返回。timeout指定為負數值表示無限超時;timeout為0指示poll調用立即返回并列出準備好I/O的文件描述符,但并不等待其它的事件。這種情況下,poll()就像它的名字那樣,一旦選舉出來,立即返回。
    返回值和錯誤代碼
    成功時,poll()返回結構體中revents域不為0的文件描述符個數;如果在超時前沒有任何事件發生,poll()返回0;失敗時,poll()返回-1,并設置errno為下列值之一:
    EBADF,一個或多個結構體中指定的文件描述符無效。
    EFAULT,fds指針指向的地址超出進程的地址空間。
    EINTR,請求的事件之前產生一個信號,調用可以重新發起。
    EINVAL,nfds參數超出PLIMIT_NOFILE值。
    ENOMEM,可用內存不足,無法完成請求。


    以上內容來自《OReilly.Linux.System.Programming - Talking.Directly.to.the.Kernel.and.C.Library.2007》

    Epoll的優點:
    1.支持一個進程打開大數目的socket描述符(FD)
    ??? select 最不能忍受的是一個進程所打開的FD是有一定限制的,由FD_SETSIZE設置,默認值是2048。對于那些需要支持的上萬連接數目的IM服務器來說顯然太少了。這時候你一是可以選擇修改這個宏然后重新編譯內核,不過資料也同時指出這樣會帶來網絡效率的下降,二是可以選擇多進程的解決方案(傳統的 Apache方案),不過雖然linux上面創建進程的代價比較小,但仍舊是不可忽視的,加上進程間數據同步遠比不上線程間同步的高效,所以也不是一種完美的方案。不過? epoll則沒有這個限制,它所支持的FD上限是最大可以打開文件的數目,這個數字一般遠大于2048,舉個例子,在1GB內存的機器上大約是10萬左右,具體數目可以cat /proc/sys/fs/file-max察看,一般來說這個數目和系統內存關系很大。

    2.IO效率不隨FD數目增加而線性下降
    ??? 傳統的select/poll另一個致命弱點就是當你擁有一個很大的socket集合,不過由于網絡延時,任一時間只有部分的socket是"活躍"的,但是select/poll每次調用都會線性掃描全部的集合,導致效率呈現線性下降。但是epoll不存在這個問題,它只會對"活躍"的socket進行操作---這是因為在內核實現中epoll是根據每個fd上面的callback函數實現的。那么,只有"活躍"的socket才會主動的去調用 callback函數,其他idle狀態socket則不會,在這點上,epoll實現了一個"偽"AIO,因為這時候推動力在os內核。在一些? benchmark中,如果所有的socket基本上都是活躍的---比如一個高速LAN環境,epoll并不比select/poll有什么效率,相反,如果過多使用epoll_ctl,效率相比還有稍微的下降。但是一旦使用idle connections模擬WAN環境,epoll的效率就遠在select/poll之上了。

    3.使用mmap加速內核與用戶空間的消息傳遞。
    ??? 這點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要內核把FD消息通知給用戶空間,如何避免不必要的內存拷貝就很重要,在這點上,epoll是通過內核于用戶空間mmap同一塊內存實現的。而如果你想我一樣從2.5內核就關注epoll的話,一定不會忘記手工 mmap這一步的。

    4.內核微調
    ??? 這一點其實不算epoll的優點了,而是整個linux平臺的優點。也許你可以懷疑linux平臺,但是你無法回避linux平臺賦予你微調內核的能力。比如,內核TCP/IP協議棧使用內存池管理sk_buff結構,那么可以在運行時期動態調整這個內存pool(skb_head_pool)的大小--- 通過echo XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函數的第2個參數(TCP完成3次握手的數據包隊列長度),也可以根據你平臺內存大小動態調整。更甚至在一個數據包面數目巨大但同時每個數據包本身大小卻很小的特殊系統上嘗試最新的NAPI網卡驅動架構。



    ########################################################

    select/epoll的特點

    select的特點:select 選擇句柄的時候,是遍歷所有句柄,也就是說句柄有事件響應時,select需要遍歷所有句柄才能獲取到哪些句柄有事件通知,因此效率是非常低。但是如果連接很少的情況下, select和epoll的LT觸發模式相比, 性能上差別不大。
    這 里要多說一句,select支持的句柄數是有限制的, 同時只支持1024個,這個是句柄集合限制的,如果超過這個限制,很可能導致溢出,而且非常不容易發現問題, TAF就出現過這個問題, 調試了n天,才發現:)當然可以通過修改linux的socket內核調整這個參數。
    epoll的特點:epoll對于句柄事件的選擇不是遍歷的,是事件響應的,就是句柄上事件來就馬上選擇出來,不需要遍歷整個句柄鏈表,因此效率非常高,內核將句柄用紅黑樹保存的。相比于select,epoll最大的好處在于它不會隨著監聽fd數目的增長而降低效率。因為在內核中的select實現中,它是采用輪詢來處理的,輪詢的fd數目越多,自然耗時越多。并且,在linux/posix_types.h頭文件有這樣的聲明:
    #define __FD_SETSIZE ? ?1024
    表示select最多同時監聽1024個fd,當然,可以通過修改頭文件再重編譯內核來擴大這個數目,但這似乎并不治本。


    對于epoll而言還有ET和LT的區別,LT表示水平觸發,ET表示邊緣觸發,兩者在性能以及代碼實現上差別也是非常大的。

    epoll的LT和ET的區別

    LT:水平觸發,效率會低于ET觸發,尤其在大并發,大流量的情況下。但是LT對代碼編寫要求比較低,不容易出現問題。LT模式服務編寫上的表現是:只要有數據沒有被獲取,內核就不斷通知你,因此不用擔心事件丟失的情況。
    ET:邊緣觸發,效率非常高,在并發,大流量的情況下,會比LT少很多epoll的系統調用,因此效率高。但是對編程要求高,需要細致的處理每個請求,否則容易發生丟失事件的情況。

    epoll相關API

    epoll的接口非常簡單,一共就三個函數:

    1. int epoll_create(int size);

    創建一個epoll的句柄,size用來告訴內核這個監聽的數目一共有多大。這個參數不同于select()中的第一個參數,給出最大監聽的fd+1的值。需要注意的是,當創建好epoll句柄后,它就是會占用一個fd值,在linux下如果查看/proc/進程id/fd/,是能夠看到這個fd的,所以在使用完epoll后,必須調用close()關閉,否則可能導致fd被耗盡。

    2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

    epoll的事件注冊函數,它不同與select()是在監聽事件時告訴內核要監聽什么類型的事件,而是在這里先注冊要監聽的事件類型。第一個參數是epoll_create()的返回值,第二個參數表示動作,用三個宏來表示:
    EPOLL_CTL_ADD:注冊新的fd到epfd中;
    EPOLL_CTL_MOD:修改已經注冊的fd的監聽事件;
    EPOLL_CTL_DEL:從epfd中刪除一個fd;
    第三個參數是需要監聽的fd,第四個參數是告訴內核需要監聽什么事,struct epoll_event結構如下:

    typedef union epoll_data {
    ? ? void *ptr;
    ? ? int fd;
    ? ? __uint32_t u32;
    ? ? __uint64_t u64;
    } epoll_data_t;


    struct epoll_event {
    ? ? __uint32_t events; /* Epoll events */
    ? ? epoll_data_t data; /* User data variable */
    };

    events可以是以下幾個宏的集合:
    EPOLLIN :表示對應的文件描述符可以讀(包括對端SOCKET正常關閉);
    EPOLLOUT:表示對應的文件描述符可以寫;
    EPOLLPRI:表示對應的文件描述符有緊急的數據可讀(這里應該表示有帶外數據到來);
    EPOLLERR:表示對應的文件描述符發生錯誤;
    EPOLLHUP:表示對應的文件描述符被掛斷;
    EPOLLET: 將EPOLL設為邊緣觸發(Edge Triggered)模式,這是相對于水平觸發(Level Triggered)來說的。
    EPOLLONESHOT:只監聽一次事件,當監聽完這次事件之后,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到EPOLL隊列里

    3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

    等待事件的產生,類似于select()調用。參數events用來從內核得到事件的集合,maxevents告之內核這個events有多大,這個 maxevents的值不能大于創建epoll_create()時的size,參數timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。該函數返回需要處理的事件數目,如返回0表示已超時。


    示例代碼

    epoll服務器

    ?

  • #include?<sys/epoll.h>??
  • #include?<netinet/in.h>??
  • #include?<sys/types.h>??????????/*?See?NOTES?*/??
  • #include?<sys/socket.h>??
  • #include?<string.h>??
  • #include?<stdio.h>??
  • #include?<unistd.h>??
  • #include?<fcntl.h>??
  • ??
  • #include?<errno.h>??
  • #include?<stdlib.h>??
  • typedef?struct?sockaddr_in?sockaddr_in?;??
  • typedef?struct?sockaddr?????sockaddr?;??
  • ??
  • #define?SER_PORT????8080??
  • ??
  • int?nonblock(int?fd){??
  • ????int?opt?;??
  • ????opt?=?fcntl(fd,F_GETFL);??
  • ????opt?|=?O_NONBLOCK?;??
  • ????return?fcntl(fd,F_SETFL,opt);??
  • }??
  • ??
  • int?main(int?argc,char**argv){??
  • ????sockaddr_in?srv,?cli?;??
  • ????int?listen_fd?,con_fd?;??
  • ????socklen_t??len;??
  • ????int?res?,nsize,ws;??
  • ????char?buf[255];??
  • ??
  • ????int?epfd,ers;??
  • ????struct?epoll_event?evn,events[50];??
  • ????int?i;??
  • ??
  • ????bzero(&srv,sizeof(srv));??
  • ????bzero(&cli,sizeof(cli));??
  • ????srv.sin_port=?SER_PORT?;??
  • ????srv.sin_family?=?AF_INET?;??
  • ????listen_fd?=?socket(AF_INET,SOCK_STREAM,0);??
  • ??
  • ????int?yes?=?1;??
  • ????setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int));??
  • ??
  • ????if(bind(listen_fd,(sockaddr*)&srv,sizeof(sockaddr))<0)??{??
  • ????????perror("bind");??
  • ????????exit(0);??
  • ????}??
  • ????listen(listen_fd,100);??
  • ????nonblock(listen_fd);??
  • ????epfd?=?epoll_create(200);??
  • ????evn.events?=?EPOLLIN|EPOLLET?;??
  • ????evn.data.fd?=?listen_fd;???
  • ????epoll_ctl(epfd,EPOLL_CTL_ADD,listen_fd,&evn);??
  • ????static?int?count?;??
  • ????while(1){??
  • ????????ers?=?epoll_wait(epfd,events,100,5000);??
  • ????????if(ers<0?){??
  • ????????????perror("epoll_wait:");exit(0);??
  • ????????}else?if(ers==0){??
  • ????????????printf("time?out:%d\n",count++);??
  • ????????????continue?;??
  • ????????}??
  • ????????for(i=0;i<ers;i++){??
  • ????????????if(events[i].data.fd?==?listen_fd){??
  • ????????????????con_fd?=?accept(listen_fd,(sockaddr*)&cli?,&len);??
  • ????????????????nonblock(con_fd);??
  • ????????????????printf("connect?from:%s\n",inet_ntoa(cli.sin_addr));??
  • ????????????????evn.data.fd?=?con_fd;??
  • ????????????????evn.events?=?EPOLLIN?|?EPOLLET?;??
  • ????????????????epoll_ctl(epfd,EPOLL_CTL_ADD,con_fd,&evn);??
  • ??
  • ????????????}else?if(events[i].events?&?EPOLLIN){?????
  • ??????????????????
  • ????????????????nsize?=?0;??
  • ????????????????while((res=read(events[i].data.fd,buf+nsize,sizeof(buf)-1))>0){??
  • ????????????????????nsize+=?res;??
  • ????????????????}??
  • ????????????????if(res==0){??
  • ????????????????????epoll_ctl(epfd,EPOLL_CTL_DEL,events[i].data.fd,NULL);?????
  • ????????????????????printf("a?client?over\n");??
  • ????????????????????close(con_fd);??
  • ????????????????????continue?;??
  • ????????????????}else?if(res<0?&&?errno!=EAGAIN){??
  • ????????????????????perror("read");??
  • ????????????????????continue?;??
  • ????????????????}??
  • ????????????????buf[nsize]=0;??
  • ????????????????evn.data.fd?=?events[i].data.fd;??
  • ????????????????evn.events=EPOLLOUT|EPOLLET?;??
  • ????????????????epoll_ctl(epfd,EPOLL_CTL_MOD,events[i].data.fd,&evn);?????????????????
  • ??????????????????
  • ????????????}else?if(events[i].events?&?EPOLLOUT){??
  • ????????????????nsize?=?strlen(buf);??
  • ????????????????ws?=?0;??
  • ????????????????while(nsize>0){??
  • ?????????????????????ws=write(events[i].data.fd,buf,nsize);??
  • ????????????????????nsize-=ws;??
  • ????????????????}??
  • ????????????????evn.data.fd?=?events[i].data.fd;??
  • ????????????????evn.events=EPOLLIN|EPOLLET?;??
  • ????????????????epoll_ctl(epfd,EPOLL_CTL_MOD,events[i].data.fd,&evn);?????
  • ????????????}else{??
  • ????????????????printf("others\n");??
  • ??????????????????
  • ????????????}?????????????
  • ????????}??
  • ??
  • ????}??
  • ??
  • ????close(listen_fd);??
  • ??????
  • ????return?0;??
  • }??

  • ?

    客戶端測試代碼:

    ?

  • #include?<sys/epoll.h>??
  • #include?<netinet/in.h>??
  • #include?<sys/types.h>??????????/*?See?NOTES?*/??
  • #include?<sys/socket.h>??
  • #include?<strings.h>??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?<unistd.h>??
  • typedef?struct?sockaddr_in?sockaddr_in?;??
  • typedef?struct?sockaddr?????sockaddr?;??
  • ??
  • #define?SER_PORT????8080??
  • #define?IP_ADDR?????"10.33.28.230"??
  • ??
  • int?main(int?argc,char**argv){??
  • ????sockaddr_in?srv,?cli?;??
  • ????int?listen_fd?,con_fd?;??
  • ????socklen_t??len;??
  • ????int?res,ws?;??
  • ????char?buf[255];??
  • ??
  • ????bzero(&srv,sizeof(srv));??
  • ????bzero(&cli,sizeof(cli));??
  • ????srv.sin_port=?SER_PORT?;??
  • ????srv.sin_family?=?AF_INET?;??
  • ????inet_pton(AF_INET,IP_ADDR,&srv.sin_addr);??
  • ??
  • ????listen_fd?=?socket(AF_INET,SOCK_STREAM,0);??
  • ????if(connect(listen_fd,(sockaddr*)&srv,sizeof(sockaddr))<0){??
  • ????????perror("connect");??
  • ????????exit(0);??
  • ????}??
  • ????while(1){??
  • ????????res?=?read(STDIN_FILENO,buf,sizeof(buf)-1);??
  • ????????ws?=?write(listen_fd,buf,res);??
  • ????????res?=?read(listen_fd,buf,sizeof(buf)-1);??
  • ????????ws?=?write(STDOUT_FILENO,buf,res);??
  • ????}??
  • ??
  • ????close(listen_fd);??
  • ??????
  • ????return?0;??
  • }??
  • ?

    總結

    以上是生活随笔為你收集整理的Linux下select, poll和epoll IO模型的详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产亚洲欧美日韩亚洲中文色 | 精品久久久无码中文字幕 | 国产97在线 | 亚洲 | 久久亚洲中文字幕无码 | 动漫av一区二区在线观看 | 九月婷婷人人澡人人添人人爽 | 丰满护士巨好爽好大乳 | 国产人妻精品一区二区三区 | 亚洲精品一区三区三区在线观看 | 成人免费视频在线观看 | 熟妇人妻无码xxx视频 | 亚洲区小说区激情区图片区 | 久久99久久99精品中文字幕 | 日本精品少妇一区二区三区 | 国产精品久免费的黄网站 | 无码人妻精品一区二区三区下载 | 亚洲区欧美区综合区自拍区 | 国产精品国产自线拍免费软件 | 亚洲精品久久久久中文第一幕 | 国产高潮视频在线观看 | 啦啦啦www在线观看免费视频 | 狠狠综合久久久久综合网 | 国产精品-区区久久久狼 | 大屁股大乳丰满人妻 | 毛片内射-百度 | 亚洲国产精品无码一区二区三区 | 蜜桃av抽搐高潮一区二区 | 欧美zoozzooz性欧美 | 久久综合激激的五月天 | 午夜性刺激在线视频免费 | 国精产品一区二区三区 | www国产精品内射老师 | 丝袜美腿亚洲一区二区 | 97无码免费人妻超级碰碰夜夜 | 国产精品无套呻吟在线 | 久久久久久九九精品久 | 丰满诱人的人妻3 | 亚洲一区二区三区在线观看网站 | 狠狠色欧美亚洲狠狠色www | 草草网站影院白丝内射 | 99久久无码一区人妻 | 日韩精品久久久肉伦网站 | 无码任你躁久久久久久久 | 鲁一鲁av2019在线 | 国产亚洲欧美日韩亚洲中文色 | 日本xxxx色视频在线观看免费 | 久久国产精品萌白酱免费 | 欧美日韩视频无码一区二区三 | 1000部夫妻午夜免费 | 国产免费久久久久久无码 | 亚洲色www成人永久网址 | 国产精品久久国产三级国 | 久久精品99久久香蕉国产色戒 | 国产九九九九九九九a片 | 亚洲精品欧美二区三区中文字幕 | 国产性生大片免费观看性 | 国产在线aaa片一区二区99 | 欧美黑人性暴力猛交喷水 | a在线亚洲男人的天堂 | 人妻少妇精品无码专区动漫 | 秋霞特色aa大片 | 奇米影视7777久久精品 | 又粗又大又硬又长又爽 | 国语自产偷拍精品视频偷 | 国产精品久久精品三级 | 久久人人爽人人爽人人片ⅴ | √天堂资源地址中文在线 | 日日噜噜噜噜夜夜爽亚洲精品 | 午夜不卡av免费 一本久久a久久精品vr综合 | 国产超碰人人爽人人做人人添 | 图片区 小说区 区 亚洲五月 | 国产午夜无码视频在线观看 | 亚洲一区二区三区香蕉 | 久久久国产一区二区三区 | 日本精品人妻无码免费大全 | 国产熟女一区二区三区四区五区 | 夜夜影院未满十八勿进 | 欧美怡红院免费全部视频 | 国模大胆一区二区三区 | 无码精品国产va在线观看dvd | 亚洲色www成人永久网址 | 一本色道久久综合狠狠躁 | 久久99精品久久久久久动态图 | 亚洲日本va午夜在线电影 | 日韩成人一区二区三区在线观看 | 无遮挡啪啪摇乳动态图 | 好屌草这里只有精品 | 免费乱码人妻系列无码专区 | 麻豆人妻少妇精品无码专区 | 3d动漫精品啪啪一区二区中 | 性做久久久久久久免费看 | 国产精品久久久久久久9999 | 在线看片无码永久免费视频 | 亚洲一区二区三区播放 | 亚洲熟悉妇女xxx妇女av | 麻豆国产97在线 | 欧洲 | 波多野结衣av一区二区全免费观看 | 久久zyz资源站无码中文动漫 | 精品国产一区二区三区av 性色 | 天天摸天天碰天天添 | 99国产欧美久久久精品 | 亚洲爆乳精品无码一区二区三区 | www国产精品内射老师 | 亚洲色成人中文字幕网站 | 亚洲乱亚洲乱妇50p | 国产深夜福利视频在线 | 国产精品18久久久久久麻辣 | 99视频精品全部免费免费观看 | 久久国语露脸国产精品电影 | 无码纯肉视频在线观看 | 国产亚洲精品久久久久久久 | 乱码av麻豆丝袜熟女系列 | 性色欲网站人妻丰满中文久久不卡 | 久久天天躁狠狠躁夜夜免费观看 | 成在人线av无码免费 | 精品国产aⅴ无码一区二区 | 国产内射爽爽大片视频社区在线 | 纯爱无遮挡h肉动漫在线播放 | 亚洲性无码av中文字幕 | 亚洲日韩一区二区三区 | 99国产欧美久久久精品 | 久久久久国色av免费观看性色 | 免费观看激色视频网站 | 色狠狠av一区二区三区 | 天天av天天av天天透 | 白嫩日本少妇做爰 | 国产两女互慰高潮视频在线观看 | 中文字幕无码乱人伦 | 亚洲精品一区二区三区在线观看 | 少妇无套内谢久久久久 | 97se亚洲精品一区 | 色综合久久88色综合天天 | 性欧美牲交在线视频 | 午夜福利试看120秒体验区 | 国产三级久久久精品麻豆三级 | 国产精品va在线播放 | 老头边吃奶边弄进去呻吟 | 国产精品人人爽人人做我的可爱 | 无套内谢的新婚少妇国语播放 | 国产精品人人爽人人做我的可爱 | 亚洲国产一区二区三区在线观看 | 亚洲自偷自拍另类第1页 | 兔费看少妇性l交大片免费 | 欧美人与物videos另类 | 精品成人av一区二区三区 | 国产精品内射视频免费 | 99久久精品日本一区二区免费 | 好屌草这里只有精品 | 中文字幕乱码中文乱码51精品 | 蜜桃av抽搐高潮一区二区 | 精品国产成人一区二区三区 | 国产人妻精品一区二区三区不卡 | 色妞www精品免费视频 | a国产一区二区免费入口 | 亚洲精品一区三区三区在线观看 | 免费无码午夜福利片69 | 久久五月精品中文字幕 | 爆乳一区二区三区无码 | 国产成人无码区免费内射一片色欲 | 无码国产激情在线观看 | 国产麻豆精品一区二区三区v视界 | 欧美精品一区二区精品久久 | 图片区 小说区 区 亚洲五月 | 成年美女黄网站色大免费视频 | 亚洲中文字幕无码中字 | 亚洲综合另类小说色区 | 国产成人久久精品流白浆 | 久久精品国产大片免费观看 | 成人欧美一区二区三区黑人免费 | 在线a亚洲视频播放在线观看 | 久久精品人人做人人综合 | 欧美日本精品一区二区三区 | 国产精品第一区揄拍无码 | 国产无遮挡吃胸膜奶免费看 | 国产va免费精品观看 | 黄网在线观看免费网站 | 国产亚洲视频中文字幕97精品 | 亚洲欧美国产精品专区久久 | 亚洲成色www久久网站 | yw尤物av无码国产在线观看 | 天天综合网天天综合色 | 熟女少妇人妻中文字幕 | 日本va欧美va欧美va精品 | 18禁黄网站男男禁片免费观看 | 国产一区二区三区精品视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 狂野欧美性猛xxxx乱大交 | 国精产品一品二品国精品69xx | 麻豆精品国产精华精华液好用吗 | 久久精品国产一区二区三区肥胖 | 啦啦啦www在线观看免费视频 | 国色天香社区在线视频 | 久久人人爽人人爽人人片av高清 | 国产莉萝无码av在线播放 | 秋霞成人午夜鲁丝一区二区三区 | 内射欧美老妇wbb | 国产内射老熟女aaaa | 精品人妻人人做人人爽夜夜爽 | 亚洲综合色区中文字幕 | 国产成人无码专区 | 国产在线精品一区二区三区直播 | 免费乱码人妻系列无码专区 | 久久精品人人做人人综合试看 | 亚洲色欲色欲欲www在线 | 正在播放老肥熟妇露脸 | 国产熟妇另类久久久久 | 国产精品亚洲一区二区三区喷水 | 成人精品天堂一区二区三区 | 97久久国产亚洲精品超碰热 | 香蕉久久久久久av成人 | 国产精品久久久久9999小说 | 少女韩国电视剧在线观看完整 | 日本精品人妻无码免费大全 | 麻豆精产国品 | 午夜不卡av免费 一本久久a久久精品vr综合 | 一本精品99久久精品77 | 久久天天躁狠狠躁夜夜免费观看 | 黑森林福利视频导航 | 国内精品人妻无码久久久影院蜜桃 | 亚洲一区二区三区在线观看网站 | 岛国片人妻三上悠亚 | 一本大道久久东京热无码av | 久久久久国色av免费观看性色 | 久久无码人妻影院 | 无遮挡啪啪摇乳动态图 | 欧洲熟妇精品视频 | 欧美老人巨大xxxx做受 | 色综合久久久无码中文字幕 | 亚洲色www成人永久网址 | 久久国产精品偷任你爽任你 | 中文字幕人成乱码熟女app | 欧美日韩色另类综合 | 久久综合给久久狠狠97色 | 沈阳熟女露脸对白视频 | 人人爽人人爽人人片av亚洲 | 国产精品无码一区二区三区不卡 | 久久精品女人天堂av免费观看 | 日日干夜夜干 | 国内丰满熟女出轨videos | 亚洲无人区一区二区三区 | 纯爱无遮挡h肉动漫在线播放 | 曰本女人与公拘交酡免费视频 | 日本肉体xxxx裸交 | 伊人久久大香线蕉av一区二区 | 日韩人妻无码一区二区三区久久99 | 日韩人妻无码中文字幕视频 | 国产乱人偷精品人妻a片 | 十八禁视频网站在线观看 | 97久久国产亚洲精品超碰热 | 国产人妻精品一区二区三区不卡 | 麻豆果冻传媒2021精品传媒一区下载 | 久久伊人色av天堂九九小黄鸭 | 人妻与老人中文字幕 | 亚洲熟妇自偷自拍另类 | 日本熟妇乱子伦xxxx | 免费无码一区二区三区蜜桃大 | 丰满妇女强制高潮18xxxx | 精品少妇爆乳无码av无码专区 | 性做久久久久久久久 | 人妻无码久久精品人妻 | 国产两女互慰高潮视频在线观看 | 国产97人人超碰caoprom | 少妇久久久久久人妻无码 | 中文字幕av无码一区二区三区电影 | 亚洲乱亚洲乱妇50p | 亚洲日韩av一区二区三区四区 | 亚洲欧美国产精品久久 | 久久精品成人欧美大片 | 国产精品丝袜黑色高跟鞋 | 日韩精品久久久肉伦网站 | 三上悠亚人妻中文字幕在线 | 久久五月精品中文字幕 | 无码人妻av免费一区二区三区 | 久久久精品成人免费观看 | 特级做a爰片毛片免费69 | 国产精品久久国产精品99 | 性欧美疯狂xxxxbbbb | 国产精品久久久 | 少妇被黑人到高潮喷出白浆 | 亚洲欧洲日本综合aⅴ在线 | 又大又黄又粗又爽的免费视频 | 国产av久久久久精东av | 久久精品女人天堂av免费观看 | 久久综合网欧美色妞网 | 亚洲精品国产精品乱码视色 | 少妇厨房愉情理9仑片视频 | 日韩亚洲欧美精品综合 | 久久精品国产一区二区三区肥胖 | 日本熟妇人妻xxxxx人hd | 国产精品美女久久久久av爽李琼 | 日本饥渴人妻欲求不满 | 国产亚洲精品久久久久久大师 | 亚洲日韩精品欧美一区二区 | 成人欧美一区二区三区黑人 | 青草视频在线播放 | 麻豆蜜桃av蜜臀av色欲av | 色综合久久88色综合天天 | 亚洲中文字幕va福利 | 国产片av国语在线观看 | 国产成人无码午夜视频在线观看 | 中国女人内谢69xxxxxa片 | 四虎影视成人永久免费观看视频 | 人人妻人人澡人人爽欧美一区九九 | 国产精品亚洲一区二区三区喷水 | 东京热无码av男人的天堂 | 国产口爆吞精在线视频 | 国产无遮挡吃胸膜奶免费看 | 免费无码午夜福利片69 | 精品久久久中文字幕人妻 | 一区二区三区乱码在线 | 欧洲 | 日日噜噜噜噜夜夜爽亚洲精品 | 欧美性猛交内射兽交老熟妇 | 亚洲自偷自偷在线制服 | 亚洲欧洲日本无在线码 | 欧美精品国产综合久久 | 欧美精品无码一区二区三区 | 图片小说视频一区二区 | 高清不卡一区二区三区 | 久久综合狠狠综合久久综合88 | 玩弄人妻少妇500系列视频 | 人妻有码中文字幕在线 | 国产高清av在线播放 | 国产精品福利视频导航 | 亚洲综合在线一区二区三区 | 波多野结衣av一区二区全免费观看 | 久久久婷婷五月亚洲97号色 | 亚洲欧洲无卡二区视頻 | 人人妻人人澡人人爽欧美一区 | 欧美成人高清在线播放 | 久久久久av无码免费网 | 欧美黑人性暴力猛交喷水 | 性史性农村dvd毛片 | 5858s亚洲色大成网站www | 国产特级毛片aaaaaaa高清 | 精品国产aⅴ无码一区二区 | 国产又爽又猛又粗的视频a片 | 亚洲国产av美女网站 | 精品水蜜桃久久久久久久 | 国内揄拍国内精品人妻 | 精品国产成人一区二区三区 | 久久综合给合久久狠狠狠97色 | 亚洲人亚洲人成电影网站色 | 99久久久无码国产精品免费 | 欧美日韩视频无码一区二区三 | 久久99精品久久久久久动态图 | 午夜免费福利小电影 | 精品久久8x国产免费观看 | 成人女人看片免费视频放人 | 成人欧美一区二区三区 | 国产成人综合在线女婷五月99播放 | 少妇被黑人到高潮喷出白浆 | 国产精品久久国产精品99 | 国产特级毛片aaaaaaa高清 | 国产人妻人伦精品 | 成人一在线视频日韩国产 | 男人和女人高潮免费网站 | 未满小14洗澡无码视频网站 | av无码不卡在线观看免费 | 日韩精品乱码av一区二区 | 国色天香社区在线视频 | 久久99精品久久久久久动态图 | 欧美亚洲日韩国产人成在线播放 | 精品无码国产一区二区三区av | 成 人 免费观看网站 | 久久zyz资源站无码中文动漫 | 爱做久久久久久 | 久久综合色之久久综合 | 国产无套内射久久久国产 | 国产精品igao视频网 | 久久综合香蕉国产蜜臀av | 97久久精品无码一区二区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产 浪潮av性色四虎 | 久久 国产 尿 小便 嘘嘘 | 亚洲国产成人a精品不卡在线 | 久久亚洲精品中文字幕无男同 | 无码av免费一区二区三区试看 | 精品国产福利一区二区 | 国产精品99爱免费视频 | 色欲久久久天天天综合网精品 | 精品熟女少妇av免费观看 | 97久久精品无码一区二区 | 国产热a欧美热a在线视频 | 国产做国产爱免费视频 | 中文字幕色婷婷在线视频 | 人妻体内射精一区二区三四 | 狂野欧美性猛xxxx乱大交 | 麻豆av传媒蜜桃天美传媒 | 亚洲成av人在线观看网址 | 亚洲娇小与黑人巨大交 | 成人无码精品1区2区3区免费看 | 久久久婷婷五月亚洲97号色 | 日日摸天天摸爽爽狠狠97 | 中文久久乱码一区二区 | 亚洲自偷精品视频自拍 | 国产成人无码午夜视频在线观看 | 无码乱肉视频免费大全合集 | 欧美性猛交内射兽交老熟妇 | 成人综合网亚洲伊人 | 精品国精品国产自在久国产87 | 国产明星裸体无码xxxx视频 | 国产情侣作爱视频免费观看 | 国内精品久久久久久中文字幕 | 狠狠cao日日穞夜夜穞av | 中文字幕无码热在线视频 | 东京无码熟妇人妻av在线网址 | 秋霞成人午夜鲁丝一区二区三区 | 精品无码国产自产拍在线观看蜜 | 丰满肥臀大屁股熟妇激情视频 | 人妻体内射精一区二区三四 | 久久99精品国产麻豆 | 中文久久乱码一区二区 | 久久成人a毛片免费观看网站 | 国产精品沙发午睡系列 | 欧美激情综合亚洲一二区 | 久久久久久久女国产乱让韩 | 久久精品国产日本波多野结衣 | 女人高潮内射99精品 | 亚洲爆乳精品无码一区二区三区 | 三级4级全黄60分钟 | 骚片av蜜桃精品一区 | 99久久99久久免费精品蜜桃 | 国产片av国语在线观看 | 亚洲人成网站在线播放942 | 亚洲色偷偷偷综合网 | 亚洲精品一区二区三区在线观看 | 熟妇人妻无码xxx视频 | 国产乱人伦av在线无码 | 人人妻人人澡人人爽欧美一区 | 小sao货水好多真紧h无码视频 | 扒开双腿疯狂进出爽爽爽视频 | 水蜜桃色314在线观看 | 水蜜桃亚洲一二三四在线 | 久久久国产一区二区三区 | 强辱丰满人妻hd中文字幕 | 九九热爱视频精品 | 人妻尝试又大又粗久久 | 97精品国产97久久久久久免费 | 亚洲欧美色中文字幕在线 | 日日躁夜夜躁狠狠躁 | 国产香蕉97碰碰久久人人 | 最近免费中文字幕中文高清百度 | 久久亚洲精品成人无码 | 成熟女人特级毛片www免费 | 色综合久久中文娱乐网 | 丝袜美腿亚洲一区二区 | 一本大道伊人av久久综合 | 国内老熟妇对白xxxxhd | 狠狠躁日日躁夜夜躁2020 | 亚洲国产av精品一区二区蜜芽 | 又大又紧又粉嫩18p少妇 | 国产精品嫩草久久久久 | 亚洲精品国产第一综合99久久 | 日日麻批免费40分钟无码 | 欧洲vodafone精品性 | 国内精品久久毛片一区二区 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲国产精品一区二区第一页 | 日本饥渴人妻欲求不满 | 欧美性黑人极品hd | 久久精品无码一区二区三区 | 乌克兰少妇性做爰 | 欧美日韩人成综合在线播放 | 亚洲成在人网站无码天堂 | 成人女人看片免费视频放人 | 亚洲国产精品美女久久久久 | 午夜性刺激在线视频免费 | 欧美亚洲日韩国产人成在线播放 | 麻豆国产人妻欲求不满 | 夜先锋av资源网站 | 国产精品久久福利网站 | 一本久久a久久精品亚洲 | 特级做a爰片毛片免费69 | 亚洲欧洲日本综合aⅴ在线 | 国产婷婷色一区二区三区在线 | 男人的天堂2018无码 | 蜜臀av无码人妻精品 | 桃花色综合影院 | 波多野结衣av在线观看 | 天堂亚洲2017在线观看 | 国产热a欧美热a在线视频 | 久久综合色之久久综合 | 一本久道久久综合狠狠爱 | 色婷婷综合中文久久一本 | aⅴ亚洲 日韩 色 图网站 播放 | 九九久久精品国产免费看小说 | 99久久久无码国产aaa精品 | 国产美女精品一区二区三区 | 性开放的女人aaa片 | 午夜精品一区二区三区的区别 | www国产亚洲精品久久网站 | 国产精品igao视频网 | 亚洲国产精品久久久久久 | 中文字幕无码av波多野吉衣 | 久久午夜无码鲁丝片 | 亚洲小说图区综合在线 | 免费无码的av片在线观看 | 国产又粗又硬又大爽黄老大爷视 | 国产热a欧美热a在线视频 | 55夜色66夜色国产精品视频 | 国产精品资源一区二区 | 国产乡下妇女做爰 | 欧美 日韩 亚洲 在线 | 97久久精品无码一区二区 | 成人动漫在线观看 | 美女扒开屁股让男人桶 | 在线成人www免费观看视频 | 日韩精品一区二区av在线 | 伊人久久大香线蕉亚洲 | 亚洲aⅴ无码成人网站国产app | 欧美精品无码一区二区三区 | 妺妺窝人体色www在线小说 | 在线观看国产午夜福利片 | 日韩精品一区二区av在线 | 中文字幕av伊人av无码av | 久久久婷婷五月亚洲97号色 | 欧美成人免费全部网站 | 人人妻人人澡人人爽精品欧美 | 亚洲一区二区三区四区 | 一本精品99久久精品77 | 日本大香伊一区二区三区 | 中文字幕无码免费久久99 | 丝袜人妻一区二区三区 | 国产一区二区不卡老阿姨 | 国产精品多人p群无码 | 波多野结衣高清一区二区三区 | 香港三级日本三级妇三级 | 性史性农村dvd毛片 | 四虎国产精品一区二区 | 7777奇米四色成人眼影 | 国产手机在线αⅴ片无码观看 | 国产精品永久免费视频 | 婷婷五月综合激情中文字幕 | 国产精品永久免费视频 | 精品国产av色一区二区深夜久久 | 成人毛片一区二区 | 日本饥渴人妻欲求不满 | 麻豆md0077饥渴少妇 | 丝袜足控一区二区三区 | 玩弄人妻少妇500系列视频 | 天堂无码人妻精品一区二区三区 | aⅴ亚洲 日韩 色 图网站 播放 | 成人性做爰aaa片免费看 | 亚洲精品午夜无码电影网 | 国产精品久久久久久久9999 | 精品欧美一区二区三区久久久 | 国产高潮视频在线观看 | 无码人妻黑人中文字幕 | 少妇厨房愉情理9仑片视频 | 高清不卡一区二区三区 | 成人毛片一区二区 | 国产亚洲tv在线观看 | 精品国偷自产在线视频 | 久久成人a毛片免费观看网站 | 亚洲国产精品久久人人爱 | 久久久久久亚洲精品a片成人 | 久久无码中文字幕免费影院蜜桃 | 麻豆人妻少妇精品无码专区 | 亚洲中文字幕在线无码一区二区 | av无码电影一区二区三区 | 中文字幕av日韩精品一区二区 | 东京热无码av男人的天堂 | 久久久久免费看成人影片 | 欧美性生交xxxxx久久久 | 55夜色66夜色国产精品视频 | 日韩精品无码免费一区二区三区 | 大肉大捧一进一出视频出来呀 | 欧美国产日韩久久mv | 高潮毛片无遮挡高清免费视频 | 亚洲男人av天堂午夜在 | 人人妻人人澡人人爽人人精品 | √8天堂资源地址中文在线 | 亚洲国产精品无码久久久久高潮 | 熟女少妇人妻中文字幕 | 在线观看国产午夜福利片 | 成人无码视频在线观看网站 | 18无码粉嫩小泬无套在线观看 | 欧美丰满熟妇xxxx | 少妇性俱乐部纵欲狂欢电影 | 西西人体www44rt大胆高清 | 久久婷婷五月综合色国产香蕉 | 999久久久国产精品消防器材 | 国产精品无码久久av | 久久亚洲日韩精品一区二区三区 | 午夜肉伦伦影院 | 无码人妻久久一区二区三区不卡 | 麻花豆传媒剧国产免费mv在线 | 亚洲综合伊人久久大杳蕉 | 久久亚洲精品成人无码 | 疯狂三人交性欧美 | 99精品视频在线观看免费 | 天堂一区人妻无码 | 国产成人无码av一区二区 | 国产偷国产偷精品高清尤物 | 国模大胆一区二区三区 | 天堂а√在线地址中文在线 | 综合人妻久久一区二区精品 | 无码免费一区二区三区 | 亚洲熟妇色xxxxx欧美老妇 | 国产亚洲精品久久久久久久 | 亚洲日韩av一区二区三区中文 | 午夜理论片yy44880影院 | 久久综合给久久狠狠97色 | 国产特级毛片aaaaaaa高清 | 亚洲色欲色欲天天天www | 国产特级毛片aaaaaaa高清 | 久久久久久九九精品久 | 色一情一乱一伦一视频免费看 | 国产精品美女久久久 | 久久久久亚洲精品男人的天堂 | 任你躁国产自任一区二区三区 | 久久国语露脸国产精品电影 | 国产精品无码成人午夜电影 | 日韩精品一区二区av在线 | 麻豆md0077饥渴少妇 | 一个人免费观看的www视频 | 永久免费精品精品永久-夜色 | 99久久久国产精品无码免费 | 日本一区二区三区免费播放 | 欧美放荡的少妇 | 国产av剧情md精品麻豆 | 成人精品天堂一区二区三区 | 亚洲精品午夜无码电影网 | 奇米影视7777久久精品人人爽 | 中文字幕无线码免费人妻 | 欧美亚洲日韩国产人成在线播放 | 国产精品鲁鲁鲁 | 18无码粉嫩小泬无套在线观看 | 中文精品无码中文字幕无码专区 | 中国女人内谢69xxxxxa片 | 亚洲国产精品一区二区美利坚 | 国产成人无码a区在线观看视频app | 亚洲小说图区综合在线 | 性色欲情网站iwww九文堂 | 国产口爆吞精在线视频 | 亚洲精品久久久久avwww潮水 | 亚洲精品久久久久久一区二区 | 女人被爽到呻吟gif动态图视看 | 国产午夜亚洲精品不卡 | 大胆欧美熟妇xx | 亚洲精品美女久久久久久久 | 99久久99久久免费精品蜜桃 | 亚洲中文字幕av在天堂 | 性生交大片免费看女人按摩摩 | 成人影院yy111111在线观看 | 高清国产亚洲精品自在久久 | 国产精品美女久久久 | 帮老师解开蕾丝奶罩吸乳网站 | 一区二区三区高清视频一 | 精品国产一区二区三区四区在线看 | 亚洲小说图区综合在线 | 国产美女精品一区二区三区 | 亚洲国产欧美日韩精品一区二区三区 | 国产亲子乱弄免费视频 | 亚洲精品鲁一鲁一区二区三区 | 国产女主播喷水视频在线观看 | 三级4级全黄60分钟 | 国产免费久久精品国产传媒 | 天堂无码人妻精品一区二区三区 | 久久精品国产精品国产精品污 | 蜜桃无码一区二区三区 | 日本熟妇大屁股人妻 | 中文字幕无码日韩专区 | 一本大道伊人av久久综合 | 亚洲色欲久久久综合网东京热 | 青草视频在线播放 | 久久www免费人成人片 | 免费看男女做好爽好硬视频 | 兔费看少妇性l交大片免费 | 377p欧洲日本亚洲大胆 | 久久久精品国产sm最大网站 | www成人国产高清内射 | 久久国产精品偷任你爽任你 | 精品久久久久久人妻无码中文字幕 | 久久天天躁夜夜躁狠狠 | 亚洲精品一区国产 | 亚洲乱码国产乱码精品精 | 国产成人无码av片在线观看不卡 | а天堂中文在线官网 | 双乳奶水饱满少妇呻吟 | 麻豆精品国产精华精华液好用吗 | 国产情侣作爱视频免费观看 | 亚洲精品国偷拍自产在线麻豆 | 色综合久久中文娱乐网 | 精品久久久无码中文字幕 | 日本一卡2卡3卡四卡精品网站 | 国产免费观看黄av片 | 99国产精品白浆在线观看免费 | 精品国产一区二区三区四区 | 欧美日韩一区二区综合 | 午夜无码区在线观看 | 日韩欧美中文字幕在线三区 | 捆绑白丝粉色jk震动捧喷白浆 | 成人片黄网站色大片免费观看 | 午夜时刻免费入口 | www国产亚洲精品久久网站 | 在线观看免费人成视频 | 3d动漫精品啪啪一区二区中 | 性啪啪chinese东北女人 | 人妻少妇精品无码专区动漫 | 国内丰满熟女出轨videos | 成年女人永久免费看片 | 国产精品美女久久久 | 国产超级va在线观看视频 | 色综合久久久无码网中文 | 麻豆成人精品国产免费 | 日韩人妻系列无码专区 | 欧美人与物videos另类 | 久青草影院在线观看国产 | 97久久精品无码一区二区 | 一本加勒比波多野结衣 | 特级做a爰片毛片免费69 | 国产精品无码永久免费888 | 国精产品一品二品国精品69xx | 久久久精品456亚洲影院 | 四虎影视成人永久免费观看视频 | 无码精品国产va在线观看dvd | 老熟女乱子伦 | 人妻中文无码久热丝袜 | 国产精品成人av在线观看 | 国产成人一区二区三区别 | 亚洲熟悉妇女xxx妇女av | 免费国产成人高清在线观看网站 | 亚洲人成网站在线播放942 | 色婷婷综合激情综在线播放 | 99久久人妻精品免费二区 | 精品人妻中文字幕有码在线 | 99麻豆久久久国产精品免费 | 久久久精品欧美一区二区免费 | 在线精品国产一区二区三区 | 一个人看的www免费视频在线观看 | 精品偷自拍另类在线观看 | 99在线 | 亚洲 | 爆乳一区二区三区无码 | 色爱情人网站 | 国产精品18久久久久久麻辣 | 亚洲国产一区二区三区在线观看 | 天天做天天爱天天爽综合网 | 久久99精品国产麻豆 | 网友自拍区视频精品 | 国产精品对白交换视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲高清偷拍一区二区三区 | 亚洲s码欧洲m码国产av | 男人的天堂2018无码 | 久久精品国产99精品亚洲 | 少妇厨房愉情理9仑片视频 | 野狼第一精品社区 | 大地资源中文第3页 | 国产内射爽爽大片视频社区在线 | 精品无码一区二区三区爱欲 | 午夜福利试看120秒体验区 | 国产成人无码午夜视频在线观看 | 我要看www免费看插插视频 | 波多野42部无码喷潮在线 | 一本久久a久久精品亚洲 | 熟妇人妻中文av无码 | 精品久久久久香蕉网 | 精品人妻中文字幕有码在线 | 亚洲区欧美区综合区自拍区 | 亚洲日本va午夜在线电影 | 国产绳艺sm调教室论坛 | 日韩人妻系列无码专区 | 国产精品久久国产精品99 | 无码一区二区三区在线观看 | 俄罗斯老熟妇色xxxx | а天堂中文在线官网 | 欧美成人午夜精品久久久 | 又黄又爽又色的视频 | 久久久久av无码免费网 | 在线观看欧美一区二区三区 | 亚洲国产一区二区三区在线观看 | 久久无码人妻影院 | 亚洲小说春色综合另类 | 中文字幕无码av波多野吉衣 | 日韩 欧美 动漫 国产 制服 | 国产熟妇另类久久久久 | 久久国产自偷自偷免费一区调 | 国产热a欧美热a在线视频 | 成人无码视频在线观看网站 | 久久久无码中文字幕久... | 人人爽人人爽人人片av亚洲 | 日韩人妻系列无码专区 | 亚洲综合精品香蕉久久网 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲国产精品久久久久久 | 99久久人妻精品免费一区 | 麻豆果冻传媒2021精品传媒一区下载 | 妺妺窝人体色www在线小说 | a在线亚洲男人的天堂 | 成人女人看片免费视频放人 | 18禁止看的免费污网站 | 国产亚洲欧美在线专区 | 牲欲强的熟妇农村老妇女视频 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美性色19p | 免费乱码人妻系列无码专区 | 无码精品人妻一区二区三区av | 水蜜桃亚洲一二三四在线 | 国产精品久久久久久亚洲影视内衣 | 精品乱子伦一区二区三区 | av小次郎收藏 | 国产乱人偷精品人妻a片 | 日韩欧美群交p片內射中文 | 风流少妇按摩来高潮 | 男女作爱免费网站 | 丰满少妇女裸体bbw | 又紧又大又爽精品一区二区 | 国产97色在线 | 免 | 久久精品人妻少妇一区二区三区 | 欧美精品一区二区精品久久 | 欧美人与禽zoz0性伦交 | 99er热精品视频 | 欧美xxxx黑人又粗又长 | 日韩无码专区 | 中文字幕乱码亚洲无线三区 | 最新国产乱人伦偷精品免费网站 | 久久久久99精品成人片 | 日本一卡2卡3卡四卡精品网站 | 国产卡一卡二卡三 | 97夜夜澡人人爽人人喊中国片 | 窝窝午夜理论片影院 | 精品成人av一区二区三区 | 日韩少妇白浆无码系列 | 国産精品久久久久久久 | 国产精品亚洲а∨无码播放麻豆 | 精品欧洲av无码一区二区三区 | 亚欧洲精品在线视频免费观看 | 亚洲欧美日韩综合久久久 | 成人一在线视频日韩国产 | 伊人久久婷婷五月综合97色 | 东京热无码av男人的天堂 | 国产日产欧产精品精品app | 在线 国产 欧美 亚洲 天堂 | 无码吃奶揉捏奶头高潮视频 | 亚洲精品一区二区三区在线观看 | 国产精品人妻一区二区三区四 | 午夜熟女插插xx免费视频 | 精品熟女少妇av免费观看 | 日韩人妻无码一区二区三区久久99 | 中文字幕精品av一区二区五区 | 少妇性俱乐部纵欲狂欢电影 | 特大黑人娇小亚洲女 | 精品熟女少妇av免费观看 | 成熟女人特级毛片www免费 | 日韩av无码一区二区三区不卡 | 亚洲成av人在线观看网址 | 老司机亚洲精品影院 | 欧美 日韩 亚洲 在线 | 欧美大屁股xxxxhd黑色 | 无码精品人妻一区二区三区av | 欧美放荡的少妇 | 夜夜高潮次次欢爽av女 | 国产乱子伦视频在线播放 | 亚洲国产精品成人久久蜜臀 | 亚洲成a人一区二区三区 | 亚洲精品成a人在线观看 | 又色又爽又黄的美女裸体网站 | 欧美乱妇无乱码大黄a片 | 大屁股大乳丰满人妻 | 精品乱码久久久久久久 | 丝袜美腿亚洲一区二区 | 性欧美疯狂xxxxbbbb | 四虎4hu永久免费 | 影音先锋中文字幕无码 | 亚洲 日韩 欧美 成人 在线观看 | 国产精品美女久久久久av爽李琼 | 日本一本二本三区免费 | 亚洲国产欧美日韩精品一区二区三区 | 日本精品少妇一区二区三区 | 激情内射亚州一区二区三区爱妻 | 久久99精品国产麻豆蜜芽 | 性色欲网站人妻丰满中文久久不卡 | 天堂在线观看www | 无码乱肉视频免费大全合集 | 人妻无码αv中文字幕久久琪琪布 | 亚洲日韩av一区二区三区中文 | 88国产精品欧美一区二区三区 | 99久久久无码国产精品免费 | 无遮无挡爽爽免费视频 | 国产精品欧美成人 | 少妇高潮一区二区三区99 | 中文字幕无码热在线视频 | 中文字幕亚洲情99在线 | 天天爽夜夜爽夜夜爽 | 久久综合给合久久狠狠狠97色 | 天天燥日日燥 | 精品成人av一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 熟妇女人妻丰满少妇中文字幕 | 亚洲成av人综合在线观看 | 亚洲s色大片在线观看 | 国精产品一区二区三区 | 好爽又高潮了毛片免费下载 | 牲欲强的熟妇农村老妇女视频 | 在线看片无码永久免费视频 | 真人与拘做受免费视频 | 无码乱肉视频免费大全合集 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲欧美日韩成人高清在线一区 | 色综合久久久无码网中文 | а√资源新版在线天堂 | 无码人妻久久一区二区三区不卡 | 国产午夜无码视频在线观看 | 高清不卡一区二区三区 | 国产精品亚洲一区二区三区喷水 | 久久久精品人妻久久影视 | 亚洲人交乣女bbw | 欧洲熟妇精品视频 | 免费人成网站视频在线观看 | 日本一区二区三区免费播放 | 无码午夜成人1000部免费视频 | 国产精品人人爽人人做我的可爱 | 无码免费一区二区三区 | 青草视频在线播放 | 人人妻人人澡人人爽欧美一区九九 | 丰满少妇熟乱xxxxx视频 | 成人无码影片精品久久久 | 国产又粗又硬又大爽黄老大爷视 | 国产无遮挡吃胸膜奶免费看 | 兔费看少妇性l交大片免费 | 中文字幕色婷婷在线视频 | 中文字幕无码日韩专区 | 国产真实夫妇视频 | 精品亚洲成av人在线观看 | 熟妇女人妻丰满少妇中文字幕 | 搡女人真爽免费视频大全 | 人人爽人人澡人人高潮 | 在线亚洲高清揄拍自拍一品区 | 色情久久久av熟女人妻网站 | 精品久久久久香蕉网 | 亚洲精品午夜国产va久久成人 | 无码人妻丰满熟妇区五十路百度 | 成人免费视频一区二区 | 人人爽人人澡人人人妻 | 亚洲s色大片在线观看 | 欧美freesex黑人又粗又大 | 国产成人一区二区三区在线观看 | 国产精品对白交换视频 | 国产精品va在线播放 | 亚洲欧美日韩成人高清在线一区 | 国内精品一区二区三区不卡 | 大乳丰满人妻中文字幕日本 | 欧美肥老太牲交大战 | 国产人成高清在线视频99最全资源 | 国产香蕉尹人视频在线 | 人妻无码久久精品人妻 | 女人被爽到呻吟gif动态图视看 | 中文字幕无码av激情不卡 | av人摸人人人澡人人超碰下载 | 国产乱码精品一品二品 | 少妇久久久久久人妻无码 | 麻豆蜜桃av蜜臀av色欲av | 成人性做爰aaa片免费看 | 国产三级久久久精品麻豆三级 | 国产另类ts人妖一区二区 | 国产在热线精品视频 | 久久久久人妻一区精品色欧美 | 国产激情艳情在线看视频 | 扒开双腿吃奶呻吟做受视频 | 97人妻精品一区二区三区 | 日韩av无码中文无码电影 | 丰满少妇高潮惨叫视频 | 国产精品内射视频免费 | 色欲综合久久中文字幕网 | 十八禁真人啪啪免费网站 | 国产精品久久精品三级 | 在线精品亚洲一区二区 | 少妇无码吹潮 | 丰满人妻精品国产99aⅴ | 国产高清av在线播放 | 性生交大片免费看女人按摩摩 | 日韩av无码中文无码电影 | 日本又色又爽又黄的a片18禁 | 久久成人a毛片免费观看网站 | 日韩精品无码一本二本三本色 | 亚洲s色大片在线观看 | 国产婷婷色一区二区三区在线 | 中文字幕无码日韩欧毛 | 人妻有码中文字幕在线 | 国产精品第一区揄拍无码 | 麻豆av传媒蜜桃天美传媒 | 在线成人www免费观看视频 | 天堂а√在线中文在线 | 国产午夜无码精品免费看 | 精品亚洲韩国一区二区三区 | 亚洲色欲色欲欲www在线 | 377p欧洲日本亚洲大胆 | 精品日本一区二区三区在线观看 | 岛国片人妻三上悠亚 | 国产亚洲精品久久久久久国模美 | 国产精品亚洲lv粉色 | 免费人成在线观看网站 | 午夜福利一区二区三区在线观看 | 亚洲国产高清在线观看视频 | 日本一本二本三区免费 | 日韩人妻系列无码专区 | 曰韩无码二三区中文字幕 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 影音先锋中文字幕无码 | 国产精品va在线观看无码 | 国内精品一区二区三区不卡 | 午夜精品一区二区三区在线观看 | 又色又爽又黄的美女裸体网站 | av无码电影一区二区三区 | 成人欧美一区二区三区黑人 | 国产在线无码精品电影网 | 亚洲成a人片在线观看无码3d | 中文字幕中文有码在线 | 国产9 9在线 | 中文 | 国产三级久久久精品麻豆三级 | 亲嘴扒胸摸屁股激烈网站 | 精品国产aⅴ无码一区二区 | 亚洲热妇无码av在线播放 | 欧美日本免费一区二区三区 | 少妇性l交大片 | 国产乱人偷精品人妻a片 | 亚洲中文字幕乱码av波多ji | 在线亚洲高清揄拍自拍一品区 | 日日躁夜夜躁狠狠躁 | 亚洲精品午夜国产va久久成人 | 最新国产乱人伦偷精品免费网站 | 日日噜噜噜噜夜夜爽亚洲精品 | 老子影院午夜伦不卡 | 亚洲毛片av日韩av无码 | 领导边摸边吃奶边做爽在线观看 | 久久亚洲精品成人无码 | 性色av无码免费一区二区三区 | 综合人妻久久一区二区精品 | 亚洲自偷自拍另类第1页 | 18黄暴禁片在线观看 | 老熟妇仑乱视频一区二区 | 无码人妻黑人中文字幕 | 亚洲 高清 成人 动漫 | 亚欧洲精品在线视频免费观看 | 欧美国产亚洲日韩在线二区 | 国产香蕉尹人综合在线观看 | 亚洲大尺度无码无码专区 | 日本va欧美va欧美va精品 | 麻豆国产人妻欲求不满谁演的 | 天天摸天天碰天天添 | 在线亚洲高清揄拍自拍一品区 | 免费国产成人高清在线观看网站 | 99久久精品午夜一区二区 | 99久久人妻精品免费一区 | 99久久久无码国产精品免费 | 国产成人精品久久亚洲高清不卡 | 亚洲欧美中文字幕5发布 | 一本大道伊人av久久综合 | 国内老熟妇对白xxxxhd | 蜜臀aⅴ国产精品久久久国产老师 | 久久人人爽人人爽人人片ⅴ | 久久视频在线观看精品 | 国产精品无码一区二区三区不卡 | 欧美 日韩 人妻 高清 中文 | 国产成人午夜福利在线播放 | 亚洲成熟女人毛毛耸耸多 | 中文字幕精品av一区二区五区 | 中文字幕av日韩精品一区二区 | 网友自拍区视频精品 | 精品国产av色一区二区深夜久久 | 国产偷国产偷精品高清尤物 | 少妇性l交大片欧洲热妇乱xxx | 亚洲精品国产a久久久久久 | 男人的天堂2018无码 | 最新国产麻豆aⅴ精品无码 | 国产熟妇高潮叫床视频播放 | 全黄性性激高免费视频 | 国产在线无码精品电影网 | 婷婷综合久久中文字幕蜜桃三电影 | 婷婷六月久久综合丁香 | 欧洲熟妇色 欧美 | 精品国产av色一区二区深夜久久 | 双乳奶水饱满少妇呻吟 | 亚洲精品午夜国产va久久成人 | 人人妻人人澡人人爽欧美一区九九 | 全球成人中文在线 | 少妇愉情理伦片bd | 蜜桃视频插满18在线观看 | 日日摸夜夜摸狠狠摸婷婷 | 性生交片免费无码看人 | 又大又紧又粉嫩18p少妇 | 精品偷拍一区二区三区在线看 | 又大又硬又黄的免费视频 | 真人与拘做受免费视频一 | 99久久婷婷国产综合精品青草免费 | 少妇性荡欲午夜性开放视频剧场 | 成人试看120秒体验区 | 国产精品内射视频免费 | 久久无码人妻影院 | 四虎影视成人永久免费观看视频 | 欧美日韩一区二区三区自拍 | 九九综合va免费看 | 乌克兰少妇xxxx做受 | 国产精品高潮呻吟av久久4虎 | 国内揄拍国内精品少妇国语 | 在线观看国产午夜福利片 | 欧美熟妇另类久久久久久多毛 | 亚洲欧美国产精品专区久久 | 国产真人无遮挡作爱免费视频 | 无码人妻久久一区二区三区不卡 | 午夜福利电影 | 奇米影视888欧美在线观看 | 色综合久久久无码中文字幕 | 国产精品a成v人在线播放 | 55夜色66夜色国产精品视频 | 精品厕所偷拍各类美女tp嘘嘘 | 未满成年国产在线观看 | 亚洲午夜久久久影院 | 成人一在线视频日韩国产 | 色 综合 欧美 亚洲 国产 | 成人免费视频在线观看 | 久久国产精品_国产精品 | 欧美日韩人成综合在线播放 | 一区二区传媒有限公司 | 东京一本一道一二三区 | 欧美野外疯狂做受xxxx高潮 | 成 人 免费观看网站 | 一本加勒比波多野结衣 | 欧美国产日产一区二区 | 欧美肥老太牲交大战 | 无码免费一区二区三区 | 国内丰满熟女出轨videos | 日本乱偷人妻中文字幕 | 在线播放无码字幕亚洲 | 免费人成网站视频在线观看 | 人妻插b视频一区二区三区 | 色窝窝无码一区二区三区色欲 | 理论片87福利理论电影 | 亚洲小说图区综合在线 | 久久午夜无码鲁丝片 | 亚洲男人av天堂午夜在 | 5858s亚洲色大成网站www | 熟妇人妻无码xxx视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品人人爽人人做我的可爱 | 中文毛片无遮挡高清免费 | 欧美第一黄网免费网站 | 人妻少妇精品无码专区二区 | 中文精品无码中文字幕无码专区 | 美女黄网站人色视频免费国产 | 无码av最新清无码专区吞精 | 久久99精品国产麻豆蜜芽 | 亚洲国产欧美国产综合一区 | 正在播放老肥熟妇露脸 | 永久免费观看美女裸体的网站 | 亚洲va欧美va天堂v国产综合 | 成人免费视频一区二区 | 一个人看的www免费视频在线观看 | 国产精品久久久午夜夜伦鲁鲁 | 偷窥日本少妇撒尿chinese | 在线观看国产午夜福利片 | 国内揄拍国内精品少妇国语 | 1000部啪啪未满十八勿入下载 | 蜜臀aⅴ国产精品久久久国产老师 | 国产精品高潮呻吟av久久4虎 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲精品一区二区三区在线 | 永久免费精品精品永久-夜色 | 99视频精品全部免费免费观看 | 久久久精品欧美一区二区免费 | 欧美丰满熟妇xxxx性ppx人交 | 免费视频欧美无人区码 | 丰满妇女强制高潮18xxxx | 午夜嘿嘿嘿影院 | 午夜丰满少妇性开放视频 | 日本精品人妻无码免费大全 | 亚洲综合伊人久久大杳蕉 | 国产精品鲁鲁鲁 | 中文字幕无码热在线视频 | 一本久久a久久精品vr综合 | 亚洲精品中文字幕乱码 | 久久久av男人的天堂 | 鲁一鲁av2019在线 | 日韩视频 中文字幕 视频一区 | 久久无码人妻影院 | 丰满少妇弄高潮了www | 亚洲综合伊人久久大杳蕉 | 国产激情艳情在线看视频 | 日韩视频 中文字幕 视频一区 | 久久精品女人的天堂av | 国产人妻精品一区二区三区不卡 | 亚洲欧美日韩综合久久久 | 免费观看又污又黄的网站 | 玩弄人妻少妇500系列视频 | 国产熟妇高潮叫床视频播放 | 亚洲精品午夜国产va久久成人 | 性啪啪chinese东北女人 | 国产精品亚洲五月天高清 | 熟妇女人妻丰满少妇中文字幕 | 欧美freesex黑人又粗又大 | 日本丰满护士爆乳xxxx | 激情内射亚州一区二区三区爱妻 | 国产精品亚洲一区二区三区喷水 | 九九综合va免费看 | 国产性生大片免费观看性 | 高清不卡一区二区三区 | 色欲人妻aaaaaaa无码 | 日本精品少妇一区二区三区 | 日本丰满护士爆乳xxxx | 秋霞特色aa大片 | 内射老妇bbwx0c0ck | 强开小婷嫩苞又嫩又紧视频 | 国产亚洲精品久久久闺蜜 | 久久久久免费看成人影片 | 成在人线av无码免观看麻豆 | 日日摸夜夜摸狠狠摸婷婷 | 中文字幕人妻无码一夲道 | 欧美老妇与禽交 | 无码任你躁久久久久久久 | 亚洲熟妇色xxxxx欧美老妇 | 伊人久久婷婷五月综合97色 | 精品久久8x国产免费观看 | 理论片87福利理论电影 | 亚洲欧美精品伊人久久 | 日韩精品久久久肉伦网站 | 人人妻人人澡人人爽欧美一区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 精品水蜜桃久久久久久久 | 日韩亚洲欧美精品综合 | 中文字幕av日韩精品一区二区 | 久久伊人色av天堂九九小黄鸭 | 日日摸夜夜摸狠狠摸婷婷 | 熟女少妇在线视频播放 | 日韩少妇白浆无码系列 | 日韩在线不卡免费视频一区 | 亚洲中文字幕无码中文字在线 | 欧美激情一区二区三区成人 | 丰满护士巨好爽好大乳 | 国产性生交xxxxx无码 | 日本护士毛茸茸高潮 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲综合精品香蕉久久网 | 国产亚av手机在线观看 | 色诱久久久久综合网ywww | 色婷婷av一区二区三区之红樱桃 | 国产精品人人爽人人做我的可爱 | 亚洲天堂2017无码中文 | 久青草影院在线观看国产 | 亚洲伊人久久精品影院 | 一区二区三区高清视频一 | 国产美女极度色诱视频www | 日韩av激情在线观看 | 国产在线无码精品电影网 | 国产深夜福利视频在线 | 国产精品多人p群无码 | 漂亮人妻洗澡被公强 日日躁 | 人人妻人人澡人人爽欧美一区九九 | 国产人成高清在线视频99最全资源 | 西西人体www44rt大胆高清 | www国产亚洲精品久久网站 | 亚洲成a人片在线观看无码3d | 日本乱偷人妻中文字幕 | 中文字幕日韩精品一区二区三区 | 性色av无码免费一区二区三区 | 2020久久超碰国产精品最新 | 亚洲а∨天堂久久精品2021 | 兔费看少妇性l交大片免费 | 成人欧美一区二区三区黑人免费 | ass日本丰满熟妇pics | 西西人体www44rt大胆高清 | 性做久久久久久久免费看 | 宝宝好涨水快流出来免费视频 | 亚洲欧美日韩国产精品一区二区 | 中文无码精品a∨在线观看不卡 | 国产高潮视频在线观看 | 国产在热线精品视频 | yw尤物av无码国产在线观看 | 99久久人妻精品免费二区 | 国产成人精品视频ⅴa片软件竹菊 | 永久免费观看国产裸体美女 | 人妻少妇精品视频专区 | 欧美喷潮久久久xxxxx | 亚洲精品中文字幕 | 激情国产av做激情国产爱 | 中文字幕av无码一区二区三区电影 | 国产97在线 | 亚洲 | 精品亚洲韩国一区二区三区 | 欧美肥老太牲交大战 | 我要看www免费看插插视频 | 亚洲日韩av一区二区三区中文 | 亚洲色大成网站www国产 | 色 综合 欧美 亚洲 国产 | 国产亚洲精品久久久ai换 | 好屌草这里只有精品 | 亚洲の无码国产の无码影院 | 亚洲精品中文字幕久久久久 | 国产无套内射久久久国产 | 少妇无码一区二区二三区 | 久久精品99久久香蕉国产色戒 | 国产欧美亚洲精品a | 国产一区二区三区四区五区加勒比 | 成人一在线视频日韩国产 | 人妻天天爽夜夜爽一区二区 | 日本大香伊一区二区三区 | 曰韩无码二三区中文字幕 | 少妇激情av一区二区 | 天天燥日日燥 | 欧美第一黄网免费网站 | 国产成人精品久久亚洲高清不卡 | 2020久久超碰国产精品最新 | 国产精品久久久久久无码 | 亚洲男女内射在线播放 | 日产国产精品亚洲系列 | 亚洲日韩一区二区三区 | 国产区女主播在线观看 | 日韩无套无码精品 | 国色天香社区在线视频 | 欧美激情一区二区三区成人 | 鲁大师影院在线观看 | 欧美xxxx黑人又粗又长 | 亚洲无人区一区二区三区 | 天堂一区人妻无码 | 亚洲国产日韩a在线播放 | 国内少妇偷人精品视频 | 国产精品无码一区二区桃花视频 | 熟妇人妻中文av无码 | 国产亚洲美女精品久久久2020 | 国产无遮挡又黄又爽免费视频 | 99国产精品白浆在线观看免费 | 亚洲中文字幕无码中文字在线 | 国产真实乱对白精彩久久 | 亚洲中文字幕无码一久久区 | 蜜桃无码一区二区三区 | 国内精品九九久久久精品 | 色综合久久久无码中文字幕 | 玩弄少妇高潮ⅹxxxyw | 少妇性l交大片 | 国产精品久久久久久亚洲影视内衣 | 中国大陆精品视频xxxx | 国精品人妻无码一区二区三区蜜柚 | 国产精品国产三级国产专播 | 亚洲日韩精品欧美一区二区 | 成人欧美一区二区三区 | 国内老熟妇对白xxxxhd | 亚洲人成网站色7799 | 国产内射爽爽大片视频社区在线 | 中国女人内谢69xxxxxa片 | 亚洲 日韩 欧美 成人 在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 狠狠亚洲超碰狼人久久 | 国产午夜亚洲精品不卡 | 成人免费视频在线观看 | 98国产精品综合一区二区三区 | 女人被爽到呻吟gif动态图视看 | 亚拍精品一区二区三区探花 | 亚洲中文字幕无码一久久区 | 成人免费视频视频在线观看 免费 | 理论片87福利理论电影 | 亚洲日本va中文字幕 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品无套呻吟在线 | 国产深夜福利视频在线 | 荫蒂添的好舒服视频囗交 | 国产精品.xx视频.xxtv | 亚洲色偷偷男人的天堂 | 亚洲成av人片天堂网无码】 | 欧美猛少妇色xxxxx | 精品亚洲韩国一区二区三区 | 午夜成人1000部免费视频 | 色一情一乱一伦一视频免费看 | 亚洲国产精品成人久久蜜臀 | 国产9 9在线 | 中文 | 给我免费的视频在线观看 | 久久久精品国产sm最大网站 | 中文字幕中文有码在线 | 中文字幕无码av波多野吉衣 | 国产真实伦对白全集 | 久久无码专区国产精品s | 99久久亚洲精品无码毛片 | 久久人妻内射无码一区三区 | 日韩av无码中文无码电影 | 国产精品人人爽人人做我的可爱 | 亚洲娇小与黑人巨大交 | 国産精品久久久久久久 | 中文字幕av伊人av无码av | 欧美人妻一区二区三区 | 精品厕所偷拍各类美女tp嘘嘘 | 无码吃奶揉捏奶头高潮视频 | 中文无码精品a∨在线观看不卡 | 久久97精品久久久久久久不卡 | 熟女俱乐部五十路六十路av | 国产精品久久久久久无码 | 狠狠cao日日穞夜夜穞av | 国产人妻大战黑人第1集 | 少妇激情av一区二区 | 亚洲va欧美va天堂v国产综合 | 99精品视频在线观看免费 | 久久精品无码一区二区三区 | 国产成人精品必看 | 国产农村妇女高潮大叫 | av小次郎收藏 | 亚洲精品国偷拍自产在线麻豆 | 国产午夜无码精品免费看 | 人妻夜夜爽天天爽三区 | 欧美zoozzooz性欧美 | 久久国语露脸国产精品电影 | 99久久久无码国产aaa精品 | 麻豆国产人妻欲求不满谁演的 | 久久久中文久久久无码 | 国产真实乱对白精彩久久 | 秋霞成人午夜鲁丝一区二区三区 | 国产舌乚八伦偷品w中 | 久久久国产精品无码免费专区 | 亚洲 激情 小说 另类 欧美 | 丁香花在线影院观看在线播放 | 国产美女极度色诱视频www | 亚洲熟妇色xxxxx欧美老妇y | 无码人妻av免费一区二区三区 | 一本久道久久综合狠狠爱 | 无码人妻丰满熟妇区五十路百度 | 国产精品久久国产精品99 | 色妞www精品免费视频 | 亚洲成色在线综合网站 | 欧美激情综合亚洲一二区 | 欧美熟妇另类久久久久久多毛 | 鲁大师影院在线观看 | 国产精品嫩草久久久久 | 国产特级毛片aaaaaa高潮流水 | 久久国内精品自在自线 | 亚洲色大成网站www国产 | 性色欲网站人妻丰满中文久久不卡 | 成人亚洲精品久久久久 | 国产热a欧美热a在线视频 | 帮老师解开蕾丝奶罩吸乳网站 | 国产精品美女久久久 | 欧美成人免费全部网站 | 亚洲性无码av中文字幕 | 亚洲精品一区二区三区婷婷月 | 久久国产劲爆∧v内射 | 麻豆国产人妻欲求不满 | 综合人妻久久一区二区精品 | 老司机亚洲精品影院无码 | 午夜精品一区二区三区的区别 | 免费无码一区二区三区蜜桃大 | 国产乱人偷精品人妻a片 | 熟妇人妻无乱码中文字幕 | 亚洲一区二区三区在线观看网站 | www一区二区www免费 | 鲁鲁鲁爽爽爽在线视频观看 | 国产三级久久久精品麻豆三级 | 美女扒开屁股让男人桶 | 国产精品亚洲专区无码不卡 | 又大又硬又黄的免费视频 | 久久99热只有频精品8 | 国产一区二区三区精品视频 | 九九热爱视频精品 | 亚洲欧美精品伊人久久 | 丰腴饱满的极品熟妇 | 色综合天天综合狠狠爱 | 国语精品一区二区三区 | 少妇久久久久久人妻无码 | 国产综合久久久久鬼色 | 亚洲精品一区二区三区在线观看 | 一本精品99久久精品77 | 亚洲精品一区二区三区婷婷月 | 国产成人无码午夜视频在线观看 | 欧美国产日韩亚洲中文 | 玩弄人妻少妇500系列视频 | 色综合久久久久综合一本到桃花网 | 婷婷色婷婷开心五月四房播播 | 久久国产精品萌白酱免费 | 内射后入在线观看一区 | 又紧又大又爽精品一区二区 | 乱码av麻豆丝袜熟女系列 | 国产成人无码av一区二区 | 成人免费视频视频在线观看 免费 | 亚洲の无码国产の无码步美 | 女人被爽到呻吟gif动态图视看 | 天天摸天天透天天添 | 一本精品99久久精品77 | 无码一区二区三区在线观看 | 国产情侣作爱视频免费观看 | 日本免费一区二区三区最新 | 国产精品嫩草久久久久 | 天天躁夜夜躁狠狠是什么心态 | 久久无码中文字幕免费影院蜜桃 | 一区二区三区高清视频一 | 国产特级毛片aaaaaaa高清 | 国产亲子乱弄免费视频 | 在线а√天堂中文官网 | 久久国产精品精品国产色婷婷 | 精品国产福利一区二区 | 377p欧洲日本亚洲大胆 | 色综合久久网 | 四虎国产精品一区二区 | 国产舌乚八伦偷品w中 | 波多野结衣av在线观看 | 午夜福利试看120秒体验区 | 亚洲国产成人a精品不卡在线 | 亚洲熟妇色xxxxx欧美老妇 | 午夜福利一区二区三区在线观看 | 日本丰满护士爆乳xxxx | 东京热男人av天堂 | 国产成人精品一区二区在线小狼 | 日韩欧美成人免费观看 | 国产综合在线观看 | 日本护士xxxxhd少妇 | 99精品国产综合久久久久五月天 | 成人免费视频一区二区 | 最新国产麻豆aⅴ精品无码 | 青草青草久热国产精品 | 好屌草这里只有精品 | 亚洲色大成网站www国产 | 牲欲强的熟妇农村老妇女视频 | 九九在线中文字幕无码 | 99精品无人区乱码1区2区3区 | 131美女爱做视频 | 日本饥渴人妻欲求不满 | 55夜色66夜色国产精品视频 | 一本久久a久久精品vr综合 | 精品熟女少妇av免费观看 | 亚洲精品一区二区三区四区五区 | 久久天天躁狠狠躁夜夜免费观看 | 精品国产一区二区三区av 性色 | 天天综合网天天综合色 | 国产情侣作爱视频免费观看 | 日日碰狠狠丁香久燥 | 精品久久久无码中文字幕 | 国产亚洲精品久久久久久大师 | 成人精品视频一区二区 | 国产亚洲视频中文字幕97精品 | 亚洲国产精华液网站w | 四虎国产精品一区二区 | 日本饥渴人妻欲求不满 | 国产在热线精品视频 | 亚洲色欲久久久综合网东京热 | 亚洲精品一区二区三区四区五区 | 国产成人亚洲综合无码 | 久久久精品456亚洲影院 | 国产乱码精品一品二品 | 在线播放无码字幕亚洲 | 亚洲自偷精品视频自拍 | 国内精品人妻无码久久久影院 | 国产精品怡红院永久免费 | 婷婷丁香六月激情综合啪 | 精品欧美一区二区三区久久久 | 未满成年国产在线观看 | 成人aaa片一区国产精品 | 亚洲乱码日产精品bd | 国产午夜福利亚洲第一 | 欧美 日韩 亚洲 在线 | 亚洲乱码国产乱码精品精 | 国产精品毛多多水多 | 女人高潮内射99精品 | 野外少妇愉情中文字幕 | 日日天干夜夜狠狠爱 | 日韩精品乱码av一区二区 | 国产亚洲精品久久久久久久 | 成人免费视频视频在线观看 免费 | 成在人线av无码免观看麻豆 | 天天综合网天天综合色 | 久久午夜无码鲁丝片 | 精品日本一区二区三区在线观看 | 夫妻免费无码v看片 | 色噜噜亚洲男人的天堂 | 人人澡人人妻人人爽人人蜜桃 | 亚洲小说春色综合另类 | 99精品国产综合久久久久五月天 | 久久精品中文字幕一区 | 大乳丰满人妻中文字幕日本 | 亚洲精品国产精品乱码视色 | 国产乱人无码伦av在线a | 扒开双腿疯狂进出爽爽爽视频 | 男女下面进入的视频免费午夜 | 中文精品久久久久人妻不卡 | 精品aⅴ一区二区三区 | 妺妺窝人体色www在线小说 | 人人妻人人澡人人爽欧美一区 | 中文无码成人免费视频在线观看 | 熟妇人妻中文av无码 | 99久久99久久免费精品蜜桃 | aⅴ亚洲 日韩 色 图网站 播放 | 鲁一鲁av2019在线 | 青青草原综合久久大伊人精品 | 亚洲gv猛男gv无码男同 | 最近中文2019字幕第二页 | 成人影院yy111111在线观看 | 欧美亚洲日韩国产人成在线播放 | 国产莉萝无码av在线播放 | 精品无码国产一区二区三区av | 日日摸夜夜摸狠狠摸婷婷 | 国产免费观看黄av片 | 亚洲欧美中文字幕5发布 | 野狼第一精品社区 | 日日麻批免费40分钟无码 | 亚洲综合精品香蕉久久网 | 97se亚洲精品一区 | 中文字幕+乱码+中文字幕一区 | 乱人伦人妻中文字幕无码 | 国产乱人无码伦av在线a | 丰满岳乱妇在线观看中字无码 | 午夜成人1000部免费视频 | 三上悠亚人妻中文字幕在线 | 久久aⅴ免费观看 | 亚洲一区二区三区播放 | 好男人www社区 | 亚洲国产av精品一区二区蜜芽 | 色一情一乱一伦一视频免费看 | 成人性做爰aaa片免费看 | 日本护士xxxxhd少妇 | 久久午夜夜伦鲁鲁片无码免费 | 又紧又大又爽精品一区二区 | 波多野结衣乳巨码无在线观看 | 午夜精品一区二区三区的区别 | 亚洲经典千人经典日产 | 无码精品人妻一区二区三区av | 国产人妻精品一区二区三区 | 午夜福利不卡在线视频 | 亚洲国产精品一区二区第一页 | 激情国产av做激情国产爱 | 亚洲精品一区二区三区大桥未久 | 午夜福利试看120秒体验区 | yw尤物av无码国产在线观看 | 国产亚洲精品久久久闺蜜 | 色欲综合久久中文字幕网 | 国产高潮视频在线观看 | 高清国产亚洲精品自在久久 | 国产精品99久久精品爆乳 | 大地资源中文第3页 | 伊人久久婷婷五月综合97色 | 国产日产欧产精品精品app | 国产一区二区三区日韩精品 | 国产特级毛片aaaaaaa高清 | 久久久久se色偷偷亚洲精品av | 男女作爱免费网站 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲s色大片在线观看 | 99精品无人区乱码1区2区3区 | 丰满岳乱妇在线观看中字无码 | 色老头在线一区二区三区 | 亚洲欧洲中文日韩av乱码 | 亚洲中文字幕乱码av波多ji | 久久久精品人妻久久影视 | 国产人妻精品午夜福利免费 | 国产乱子伦视频在线播放 | 98国产精品综合一区二区三区 | 人妻少妇精品无码专区二区 | 一本久久a久久精品vr综合 | 亚洲色欲色欲欲www在线 | 日产精品99久久久久久 | 国产两女互慰高潮视频在线观看 | 国产精品鲁鲁鲁 | 国产精品久久久久久久影院 | 国产精品永久免费视频 | 99久久亚洲精品无码毛片 | 日韩精品一区二区av在线 | 日韩 欧美 动漫 国产 制服 | 国产精品国产自线拍免费软件 | 中文字幕乱码人妻无码久久 | 国产suv精品一区二区五 | 久久伊人色av天堂九九小黄鸭 | 99久久久无码国产aaa精品 | 在线观看国产一区二区三区 | 少妇愉情理伦片bd | 亚洲精品中文字幕久久久久 | 亚洲 日韩 欧美 成人 在线观看 | 少妇厨房愉情理9仑片视频 | 99精品无人区乱码1区2区3区 | 丰满少妇女裸体bbw | 欧美日韩精品 | 小泽玛莉亚一区二区视频在线 | 国产成人无码av在线影院 | 亚洲中文字幕无码中文字在线 | 亚洲 日韩 欧美 成人 在线观看 | 欧美人与善在线com | 丝袜足控一区二区三区 | 中文字幕无码人妻少妇免费 | 樱花草在线播放免费中文 | 亚洲欧洲中文日韩av乱码 | 人妻少妇精品无码专区二区 | 欧美日韩亚洲国产精品 | 日产国产精品亚洲系列 | 在线a亚洲视频播放在线观看 | 日本精品人妻无码77777 天堂一区人妻无码 | 女高中生第一次破苞av |