日本高清免费一本视频100禁_在线不卡欧美精品一区二区三区_国产一区二区好的精华液_中文综合在线_国产啊啊啊视频在线观看_大地资源网免费观看高清

中國專業(yè)IT外包服務

用心服務每一天
IT之道-艾銻知道

您當前位置: 主頁 > IT服務 > 網絡服務 >

網絡技術編程之多線程服務器端的實現


2015-10-28 08:48 作者:admin 瀏覽量:

  線程的創(chuàng)建和上下文切換開銷更小且速度更快。(網絡外包公司

  線程間交換數據時無需特殊技術。

  進程:在操作系統(tǒng)構成單獨執(zhí)行流的單位。

  線程:在進程構成單獨執(zhí)行流的單位。

  它們的包含關系是,操作系統(tǒng) > 進程 > 線程。進程與線程具體差異其實是這樣的,每個進程都有獨立的完整內存空間,它包括全局數據區(qū),堆區(qū),棧區(qū),而多進程服務器之所以開銷大是因為只是為了區(qū)分棧區(qū)里的不同函數流執(zhí)行而把數據區(qū),堆區(qū),棧區(qū)內存全部復制了一份。而多線程就高效多了,它只把棧區(qū)分離出來,進程中的數據區(qū),堆區(qū)則共享。具體內存結構示例圖如下:

  線程創(chuàng)建及運行

  線程具有單獨的執(zhí)行流,因此需要單獨定義線程的入口函數,而且還需要請求操作系統(tǒng)在單獨的執(zhí)行流中執(zhí)行該函數,完成這個功能的函數如下:

  #include int pthread_create( pthread_t * restrict thread,//保存線程ID const pthread_attr_t * restrict attr,//線程屬性,NULL默認屬性 void * (* start_routine)(void *), //線程入口函數,函數指針 void * restrict arg //傳遞給入口函數的參數 );

  實例代碼:

  #include #include #include void * thread_main(void *arg); int main(int argc, char *argv[]) { pthread_t t_id; int thread_param = 5; if (pthread_create(&t_id, NULL, thread_main, (void *)&thread_param) != 0) { puts("pthread_create() error"); return -1; } sleep(10); puts("end of main"); return 0; } void * thread_main(void *arg) { int i; int cnt =* ((int *)arg); for (i = 0; i < cnt; i++) { sleep(1); puts("running thread"); } return NULL; }

  

TCP/IP網絡編程 多線程服務器端的實現

  上面實例是用sleep延遲來控制線程的執(zhí)行的,如果主線程不做延遲那么執(zhí)行到return 0;時,進程就結束了,相應的線程也會銷毀。而明顯用sleep這種方式控制線程執(zhí)行流是不合理的,下面我們來看看一個更好的延遲函數,調用該函數的進程(或線程)將進入等待狀態(tài),直到第一個參數為ID的線程終止為止。而且可以得到線程的入口函數返回值。(IT外包

  #include int pthread_join(pthread_t thread, void **status); 參數1:線程ID 參數2:保存線程入口函數的返回值

  實例代碼:

  #include #include #include #include void * thread_main(void *arg); int main(int argc, char *argv[]) { pthread_t t_id; int thread_param = 5; void * thr_ret; //創(chuàng)建線程 if (pthread_create(&t_id, NULL, thread_main, (void *)&thread_param) != 0) { puts("pthread_create() error"); return -1; } //等待線程返回 if (pthread_join(t_id, &thr_ret) != 0) { puts("pthread_join() error"); return -1; } printf("Thread return message: %s \n", (char *)thr_ret); free(thr_ret); return 0; } //線程入口函數 void * thread_main(void *arg) { int i; int cnt =* ((int *)arg); char * msg = (char *)malloc(sizeof(char) * 50); strcpy(msg, "Hello, I am thread ~ \n"); for (i = 0; i < cnt; i++) { puts("running thread"); } return (void *)msg; }

TCP/IP網絡編程 多線程服務器端的實現

  線程存在的問題和臨界區(qū)

  前面我們知道了怎么創(chuàng)建線程,但我們都是只創(chuàng)建了一個線程,下面我們再來看看這樣一個實例,創(chuàng)建100個線程,它們都訪問了同一變量,其中一半對這個變量進行加1操作,一半進行減1操作,按道理其結果會等于0.

  #include #include #include #include #define NUM_THREAD 100 void * thread_inc(void * arg); void * thread_des(void * arg); long long num = 0; //long long類型是64位整數型,多線程共同訪問 int main(int argc, char *argv[]) { pthread_t thread_id[NUM_THREAD]; int i; //創(chuàng)建100個線程,一半執(zhí)行thread_inc,一半執(zhí)行thread_des for(i = 0; i < NUM_THREAD; i++) { if(i %2) pthread_create(&(thread_id[i]), NULL, thread_inc, NULL); else pthread_create(&(thread_id[i]), NULL, thread_des, NULL); } //等待線程返回 for (i = 0; i < NUM_THREAD; i++) pthread_join(thread_id[i], NULL); printf("result: %lld \n", num); //+1,-1按道理結果是0 return 0; } //線程入口函數1 void * thread_inc(void * arg) { for (int i = 0; i < 50000000; i++) num += 1;//臨界區(qū)(引起問題的語句就是臨界區(qū)位置) return NULL; } //線程入口函數2 void * thread_des(void * arg) { for (int i = 0; i < 50000000; i++) num -= 1;//臨界區(qū) return NULL; }

TCP/IP網絡編程 多線程服務器端的實現

  從運行結果看并不是0,而且每次運行的結果都不同。那這是什么原因引起的呢? 是因為每個線程訪問一個變量是這樣一個過程:先從內存取出這個變量值到CPU,然后CPU計算得到改變后的值,最后再將這個改變后的值寫回內存。因此,我們可以很容易看出,多個線程訪問同一變量,如果某個線程還只剛從內存取出數據,還沒來得及寫回內存,這時其它線程又訪問了這個變量,所以這個值就會不正確了。

  接下來我們再來講講怎么解決這個問題:線程同步

  線程同步

  線程同步用于解決線程訪問順序引發(fā)的問題,一般是如下兩種情況:

  同時訪問同一內存空間時發(fā)生的情況

  需要指定訪問同一內存空間的線程執(zhí)行順序的情況

  針對這兩種可能引發(fā)的情況,我們分別使用的同步技術是:互斥量和信號量。

  互斥量

  互斥量技術從字面也可以理解,就是臨界區(qū)有線程訪問,其它線程就得排隊等待,它們的訪問是互斥的,實現方式就是給臨界區(qū)加鎖與釋放鎖。

  #include int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); //創(chuàng)建互斥量 int pthread_mutex_destroy(pthread_mutex_t *mutex);//銷毀互斥量 int pthread_mutex_lock(pthread_mutex_t *mutex);//加鎖 int pthread_mutex_unlock(pthread_mutex_t *mutex);//釋放鎖

  簡言之,就是利用lock和unlock函數圍住臨界區(qū)的兩端。當某個線程調用pthread_mutex_lock進入臨界區(qū)后,如果沒有調用pthread_mutex_unlock釋放鎖退出,那么其它線程就會一直阻塞在臨界區(qū)之外,我們把這種情況稱之為死鎖。所以臨界區(qū)圍住一定要lock和unlock一一對應。

  實例代碼:

  #include #include #include #include #define NUM_THREAD 100 void * thread_inc(void * arg); void * thread_des(void * arg); long long num = 0; pthread_mutex_t mutex; int main(int argc, char *argv[]) { pthread_t thread_id[NUM_THREAD]; int i; //互斥量的創(chuàng)建 pthread_mutex_init(&mutex, NULL); for(i = 0; i < NUM_THREAD; i++) { if(i %2) pthread_create(&(thread_id[i]), NULL, thread_inc, NULL); else pthread_create(&(thread_id[i]), NULL, thread_des, NULL); } for (i = 0; i < NUM_THREAD; i++) pthread_join(thread_id[i], NULL); printf("result: %lld \n", num); pthread_mutex_destroy(&mutex); //互斥量的銷毀 return 0; } /*擴展臨界區(qū),減少加鎖,釋放鎖調用次數,但這樣變量必須加滿到50000000次后其它線程才能訪問. 這樣是延長了線程的等待時間,但縮短了加鎖,釋放鎖函數調用的時間,這里沒有定論,自己酌情考慮*/ void * thread_inc(void * arg) { pthread_mutex_lock(&mutex); //互斥量鎖住 for (int i = 0; i < 1000000; i++) num += 1; pthread_mutex_unlock(&mutex); //互斥量釋放鎖 return NULL; } /*縮短了線程等待時間,但循環(huán)創(chuàng)建,釋放鎖函數調用時間增加*/ void * thread_des(void * arg) { for (int i = 0; i < 1000000; i++) { pthread_mutex_lock(&mutex); num -= 1; pthread_mutex_unlock(&mutex); } return NULL; }

TCP/IP網絡編程 多線程服務器端的實現

  信號量

  信號量與互斥量類似,只是互斥量是用鎖來控制線程訪問而信號量是用二進制0,1來完成控制線程順序。sem_post信號量加1,sem_wait信號量減1,當信號量為0時,sem_wait就會阻斷,因此通過這樣讓信號量加1減1就能控制線程的執(zhí)行順序了。

  注釋:mac上測試信號量函數返回-1失敗,以后還是Linux上整吧,也許這些接口已經過時了…

  #include int sem_init(sem_t *sem, int pshared, unsigned int value);//創(chuàng)建信號量 int sem_destroy(sem_t *sem);//銷毀信號量 int sem_post(sem_t *sem);//信號量加1 int sem_wait(sem_t *sem);//信號量減1,為0時阻塞

  實例代碼:線程A從用戶輸入得到值后存入全局變量num,此時線程B將取走該值并累加。該過程共進行5次,完成后輸出總和并退出程序。

  #include #include #include void * read(void * arg); void * accu(void * arg); static sem_t sem_one; static sem_t sem_two; static int num; int main(int argc, char *argv[]) { pthread_t id_t1, id_t2; sem_init(&sem_one, 0, 0); sem_init(&sem_two, 0, 1); pthread_create(&id_t1, NULL, read, NULL); pthread_create(&id_t2, NULL, accu, NULL); pthread_join(id_t1, NULL); pthread_join(id_t2, NULL); sem_destroy(&sem_one); sem_destroy(&sem_two); return 0; } void * read(void * arg) { int i; for (i = 0; i < 5; i++) { fputs("Input num: ", stdout); sem_wait(&sem_two); scanf("%d", &num); sem_post(&sem_one); } return NULL; } void * accu(void * arg) { int sum = 0 , i; for (i = 0; i < 5; i++) { sem_wait(&sem_one); sum+= num; sem_post(&sem_two); } printf("Result: %d \n", sum); return NULL; }

  補充:線程的銷毀,線程創(chuàng)建后并不是其入口函數返回后就會自動銷毀,需要手動銷毀,不然線程創(chuàng)建的內存空間將一直存在。一般手動銷毀有如下兩種方式:1,調用pthread_join函數,其返回后同時銷毀線程 ,是一個阻斷函數,服務端一般不用它銷毀,因為服務端主線程不宜阻斷,還要實時監(jiān)聽客服端連接。2,調用pthread_detach函數,不會阻塞,線程返回自動銷毀線程,不過要注意調用它后不能再調用pthread_join函數,它與pthread_join主要區(qū)別就是一個是阻塞函數,一個不阻塞。

  多線程并發(fā)服務端的實現

  使用多線程實現了一個簡單的聊天程序,并對臨界區(qū)(clnt_cnt,clnt_socks)進行加鎖訪問.

  服務端:

  // // main.cpp // hello_server // // Created by app05 on 15-10-22. // Copyright (c) 2015年 app05. All rights reserved. //臨界區(qū)是:clnt_cnt和clnt_socks訪問處 #include #include #include #include #include #include #include #define BUF_SIZE 100 #define MAX_CLNT 256 void * handle_clnt(void * arg); void send_msg(char *msg, int len); void error_handling(char * msg); int clnt_cnt = 0; int clnt_socks[MAX_CLNT]; pthread_mutex_t mutx; int main(int argc, char *argv[]) { int serv_sock, clnt_sock; struct sockaddr_in serv_adr, clnt_adr; socklen_t clnt_adr_sz; pthread_t t_id; if (argc != 2) { printf("Usage : %s \n", argv[0]); exit(1); } //創(chuàng)建互斥量 pthread_mutex_init(&mutx, NULL); serv_sock = socket(PF_INET, SOCK_STREAM, 0); memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr.sin_family = AF_INET; serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); serv_adr.sin_port = htons(atoi(argv[1])); if(bind(serv_sock, (struct sockaddr *) &serv_adr, sizeof(serv_adr)) == -1) error_handling("bind() error"); if(listen(serv_sock, 5) == -1) error_handling("listen() error"); while (1) { clnt_adr_sz = sizeof(clnt_adr); clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz); //阻斷,監(jiān)聽客服端連接請求 //臨界區(qū) pthread_mutex_lock(&mutx); //加鎖 clnt_socks[clnt_cnt++] = clnt_sock; //新連接的客服端保存到clnt_socks數組里 pthread_mutex_unlock(&mutx); //釋放鎖 //創(chuàng)建線程 pthread_create(&t_id, NULL, handle_clnt, (void*) &clnt_sock); pthread_detach(t_id); //銷毀線程,線程return后自動調用銷毀,不阻斷 printf("Connected client IP: %s \n", inet_ntoa(clnt_adr.sin_addr)); } close(serv_sock); return 0; } //線程執(zhí)行 void * handle_clnt(void * arg) { int clnt_sock = *((int *)arg); int str_len = 0, i; char msg[BUF_SIZE]; while ((str_len = read(clnt_sock, msg, sizeof(msg))) != 0) send_msg(msg, str_len); //從數組中移除當前客服端 pthread_mutex_lock(&mutx); for (i = 0; i < clnt_cnt; i++) { if (clnt_sock == clnt_socks[i]) { while (i++ < clnt_cnt - 1) clnt_socks[i] = clnt_socks[i + 1]; break; } } clnt_cnt--; pthread_mutex_unlock(&mutx); close(clnt_sock); return NULL; } //向所有連接的客服端發(fā)送消息 void send_msg(char * msg, int len) { int i; pthread_mutex_lock(&mutx); for (i = 0; i < clnt_cnt; i++) write(clnt_socks[i], msg, len); pthread_mutex_unlock(&mutx); } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }

  客服端

  // // main.cpp // hello_client // // Created by app05 on 15-10-22. // Copyright (c) 2015年 app05. All rights reserved. // // #include #include #include #include #include #include #include #define BUF_SIZE 100 #define NAME_SIZE 20 void * send_msg(void * arg); void * recv_msg(void * arg); void error_handling(char *message); char name[NAME_SIZE] = "[DEFAULT]"; char msg[BUF_SIZE]; int main(int argc, const char * argv[]) { int sock; struct sockaddr_in serv_addr; pthread_t snd_thread, rcv_thread; void * thread_return; if(argc != 4) { printf("Usage: %s \n", argv[0]); exit(1); } sprintf(name, "[%s]", argv[3]); //聊天人名字,配置到編譯器參數里 sock = socket(PF_INET, SOCK_STREAM, 0); if(sock == -1) error_handling("socket() error"); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); if (connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) error_handling("connect() error"); //多線程分離輸入和輸出 (北京it外包公司)pthread_create(&snd_thread, NULL, send_msg, (void *)&sock); pthread_create(&rcv_thread, NULL, recv_msg, (void *)&sock); //阻塞,等待返回 pthread_join(snd_thread, &thread_return); pthread_join(rcv_thread, &thread_return); close(sock); return 0; } //發(fā)送消息 void * send_msg(void * arg) { int sock = *((int *)arg); char name_msg[NAME_SIZE + BUF_SIZE]; while (1) { fgets(msg, BUF_SIZE, stdin); if (!strcmp(msg, "q\n") || !strcmp(msg, "Q \n")) { close(sock); exit(0); } sprintf(name_msg, "%s %s", name, msg); write(sock, name_msg, strlen(name_msg)); } return NULL; } //接收消息 void * recv_msg(void * arg) { int sock = *((int *)arg); char name_msg[NAME_SIZE + BUF_SIZE]; int str_len; while (1) { str_len = read(sock, name_msg, NAME_SIZE + BUF_SIZE - 1); if(str_len == -1) return (void *)-1; name_msg[str_len] = 0; fputs(name_msg, stdout); } return NULL; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }

TCP/IP網絡編程 多線程服務器端的實現
TCP/IP網絡編程 多線程服務器端的實現
TCP/IP網絡編程 多線程服務器端的實現

  艾銻無限是中國領先IT外包服務商,專業(yè)為企業(yè)提供IT運維外包、電腦維護網絡維護、網絡布線、辦公設備維護、服務器維護數據備份恢復、門禁監(jiān)控、網站建設等多項IT服務外包,服務熱線:400-650-7820 聯(lián)系電話:010-62684652 咨詢QQ1548853602 地址:北京市海淀區(qū)北京科技會展2號樓16D,用心服務每一天,為企業(yè)的發(fā)展提升更高的效率,創(chuàng)造更大的價值。

  更多的IT外包信息盡在艾銻無限http://www.maosdadas.net


相關文章

IT外包服務
二維碼 關閉
主站蜘蛛池模板: 九九久久综合网站_视频一区二区综合_www.19樱桃视频_91看片在线_日韩一区二区三区在线观看_色综合天天综合网国产成人综合天_国产精品久久久久久久娇妻_91操碰 | 四虎在线免费观看_精品久久久亚洲_亚洲国产精品久久久久婷蜜芽_麻豆网在线观看_中国一级黄色毛片_久久综合久久鬼色_中文字幕在线_国产精品久久久久一区二区三区 | 手机看片福利一区二区三区_日韩做暖暖_精品人妻无码一区二区三区牛牛_无码AV无码天堂资源网_国产人澡人澡澡澡人碰视_国产精品福利一区二区三区_亚洲性受_久久免费看 | 亚洲最大色大成人av_欧美成人小视频_精品视频一区二区三区中文字幕_九色视频网_亚洲国产成人精_亚洲精品v欧美精品动漫精品_欧洲LV尺码大_一区二区三区在线看 | 黄色特级片_国产乱人伦精品一区二区_毛片一区二区三区_一级做a爱片久久_亚洲精品乱码久久久久久按摩观_久久久久久久国产精品影院_caoporn国产_全球AV集中精品导航福利 国产乱码久久久久_亚洲欧洲日韩国内高清_久99久在线观看_97中文字幕第二十二页_熟女熟妇人妻在线视频_成年女人色毛片_一区二区三区片_国产成人A亚洲精V品无码 | 日韩精品国产一区_久久久精品毛片_91视频九色网站_麻豆视频免费看了_国产在视频线在精品视频2020_国产免费一_在线免费视频_日本三级在线播放线播放 又黄又爽的成人免费视频_caopeng在线_国产精品自在线_亚洲精品美女久久久久久久久久_久久久久久国产精品免费_中国wwwxxxx_精品国产天堂_成年女人午夜毛片免费视频 | 久久AV喷潮久久AV高清_99久久精品国_亚洲aⅴ综合av国产八av_麻豆精品无码国产在线果冻_丝袜高潮流白浆潮喷在线播放_亚洲欧洲国产综合AⅤ无码_131美女MM爱做爽爽爽视频_国产视色 | 中文字幕视频在线免费观看_欧美黑人巨大久久久精品一区小蓝_欧洲日韩一区二区_精品久久久久久中文字国产_18禁免费无码无遮网站国产_手机色网_啪免费视频_欧洲国产精品精华液 | 美女超碰在线_国产亚洲精品久久久久秋_日本十九禁免费观看视频_99精品国产在热久久婷婷_麻豆高清网站播放_国产产品亚洲产品_亚洲精品在线播放_a级毛片免费观看在线 | 男人的天堂色_欧美日韩色_一性一交一伦一色一按—摩_久久婷婷五月综合色和啪_日本欧洲国产一区二区_www.色99_av网站播放_91影库_91影库免费视频-91影库影院 | 人人擦人人干_亚洲日本黄色_最新国产毛片_国产精品IGAO视频网_亚洲一区二区在线视频_JAPANXXXⅩ日本人妻HD_一吻成瘾动漫免费观看_免费看的一级毛片 | 999精品在线观看_97午夜理论片影院在线播放_亚洲精品美女久久17c_亚洲丝袜制服美女av_中文乱码字幕高清一区二区_国精一区二区三区_久久精品视频网址_日韩AV无码久久精品免费 | 国产福利免费在线观看_色小姐av_男女多P混交群体交乱A片_91精品国产乱码久久蜜臀_xf在线a精品一区二区视频网站_1000部又爽又黄无遮挡的视频_精品日产一区二区三区_亚洲午夜国产 | 夜夜艹天天干_亚洲情区_超碰在线官网_欧美人与禽2O2O性论交_欧美精品日日鲁夜夜添_成年免费无码动漫AV片在线观看_日本老肥婆BBBWBBBWZR_成人AV综合在线网站 | 久久精品亚洲人成影院_久久久久国产精品人妻_caoporm-超频在线视频_粗大的内捧猛烈进出在线视频_麻豆产精国品一二三产区区_亚洲精品中_九七精品_国产原创av中文在线观看 | 免费观看一区二区_亚洲欧美校园_亚洲AV中文无码字幕色下药_美女被按在床上_亚洲一久久_特黄一级性片看_国内a级毛片免费观看品善网_日本av中文字幕 | 波萝蜜A毛黄AAA片_国产高清在线精品_久久久视频免费观看_欧美一区二区三区性视频_免费无码成人av在线播_91av国产在线_亚洲第一AAAAA片_米奇777在线观看 | 无码人妻黑人中文字幕_日韩欧美中文视频_国产精品无码无片在线播放_亚洲精品GV天堂无码男同_久久ri资源网_亚洲天堂男人影院_国产成人欧美视频在线观看_一本大道久久a久久精二佰 | 人人妻人人澡人人爽欧美一在内谢_亚洲成aⅴ人片久青草影院_亚洲AV无码一区东京热蜜芽_性刺激久久久久久久久九色_一級特黃色毛片免費看_免费看无码特级毛片_日本成人免费在线_国产福利日本一区二区三区 | 91九色在线观看_欧美一区二区三区aa大片_久久久久久黄色片_吉吉天堂_日日夜夜操操_av天空_五月丁香六月婷综合缴情在线_国产成人深夜视频51 | 老师黑色丝袜被躁翻了AV_国产性在线观看_国产精品久久久视频_av影片在线_无遮无挡三级动态图_亚洲AV无码片VR一区二区三区_日日干b_欧美一级在线 | 亚洲午夜精_国产18av_日韩福利精品_高潮喷视频在线无码_日韩国产欧美视频_JAPANESE国产高清在线观看播放_精品国产一区二区三区四区在线_啪啪精品视频 | 成人看片在线_深夜福利备好纸巾18禁止_国产一区福利_九一精品视频_久久久国产精品无码免费专区_国产欧美在线观看精品一区二区_国产性色AV免费观看_中文字幕一区二区三区四 | 国产毛片一线_亚洲性生活片_天天干干夜夜_超碰男人_妞干网国产_3D动漫同人精品无码专区_2021av视频_国产精品久久久久久久久久久痴汉 | 欧美日韩一区在线播放_亚洲高清人人爽夜夜爽AV毛片_亚洲成在人线aⅴ免费毛片_亚洲区一区二区_欧美破苞系列二十三_国产初高中生视频在线观看_午夜性又黄又爽免费看尤物_国产精品亚洲第一区在线暖暖韩国 | 私人影院免费看_日韩三级一区二区三区_欧美国产日韩在线观看成人_人人妻一区二区三区_18禁超污无遮挡无码免费网站国产_欧美xxxx做受欧美_国产精品一二三区免费_www天天干 | 日日操天天_二区视频在线观看_一级欧美一级日韩_成人综合网在线_日本黄色片在线观看_www.17c.com小草影视_青青草手机在线观看视频_日韩新片王网 | 精品久久久久久中文字幕一区二区_亚洲国产五月综合网_97影院午夜伦不卡_综合色在线_国产99视频精品免费视频76_久久官网_久久无吗视频_国产免费高清视频在线一区二区 | 好大好爽受不了了h_人妻体验按摩到忍不住哀求继续_欧美精品欧美精品系列_色www视频永久免费男的天堂_久久精品人人槡人妻人人玩_久久精品5_日韩精品一级_久久精品一日日躁夜夜躁 | 亚洲一区二区三区激情_国产精品se_亚洲天堂2017无码中文_噜噜噜亚洲色成人网站∨_中文字幕亚洲二区_欧美精品黑色丝袜无码_九九啪啪_高清不卡一区 | 亚洲欧美中文在线视频_国产的毛片_老司机av福利_久久伊人免费视频_无码毛片一级高潮免费视频_精品欧美久久久_亚洲第一狼人天堂久久_精品区2区3区4区产品乱码9 | 狠色狠狠色狠狠狠色综合久久_99精品视频一区二区_操操操av_一级视频在线观看视频在线啦啦_久久93_chengren网站_国产经典1区2区3区_A毛片免费全部播放 | 超碰97成人_97在线视频免费人妻_韩国免费一区_无码国产色欲XXXX视频_国产精品久久久久久99999_日韩国产亚洲欧美成人图片_午夜宅男在线观看_欧美日韩综合一区二区三区 | 91在线免费观看网站_欧美一区二区三区xxxx监狱_成人国产片免费_日韩一二区在线观看_亚洲国产精品不卡av在线_97澡人人澡人澡人人澡天天_五月婷av综合网色伊人苍井空_四虎WWW成人影院观看 | 国av在线_日韩精品中文字幕视频_国产精品久久天天躁_性生活久久_午夜色场_亚洲人AV在线无码影院观看_老太脱裤让老头玩ⅹxxxx_末发育娇小性色xxxxx | 精品99久久_日本人妻人人人澡人人爽_黄色片免费看_黄绝一级毛片_国产精品性色一区二区三区_天天做爰天天爽_性暴力欧美猛交在线播放_久久精品国产亚洲77788 | 国产午夜成人无码免费看不卡_精品va天堂亚洲国产_日日干日日干_久久国产人妻一区二区_成人午夜精品无码区久久_国产激情一区二区三区_欧洲美女与动zooz_亚洲国产精品SSS在线观看AV | 成人高清视频免费观看_国产精品VA在线观看无码_写真福利视频_精品国产经典三级在线看_密色av_国产欧美一区综合_中文字幕一二三区有限公司_久久久久97国产精 | 不卡国产_色综合另类小说图片区_午夜久久久久久久久久久_亚洲AV日韩AV鸥美在线观看_挺进邻居丰满少妇的身体_12306影视午夜入口_被男人吃奶很爽的毛片_免费在线视频欧美 | 亚洲综合一区无码精品_91狼人社区_人人做人人爽国产视_日韩欧美卡一卡二卡新区_91视频成人入口_国内永久福利在线视频图片_在线观看欧美成人_色综合久久综合 | 久久精品青青大伊人av_在线日本看片免费人成视久网_日本色呦呦_一级黄色视频久久网_久久资源免费视频_久久狼人综合_午夜影院在线免费_出差被绝伦上司侵犯中文字幕 |