精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

純C語言版本的socket.io服務器端實現

開發 后端 開發工具
哈,這又是一個socket.io服務端實現,本意是,拿C練練手,加強對C和linux系統的理解,寫著寫著,就寫成了一個socket.io服務器端實現了。以為半成品,那就正式托管在github站點上吧,以便記錄一下,可讓大家批評與指正,加強內功的修煉等。

前言

哈,這又是一個socket.io服務端實現,本意是,拿C練練手,加強對C和linux系統的理解,寫著寫著,就寫成了一個socket.io服務器端實現了。以為半成品,那就正式托管在github站點上吧,以便記錄一下,可讓大家批評與指正,加強內功的修煉等。

項目地址為:yongboy/c_socket.io_server

以下部分文字,偷懶,摘錄自項目的README.md文件

說明

這是一個純C語言版本的socket.io服務器端實現,目前僅支持linux系統,嚴重依賴libev and glib等基礎庫。

在運行socket.io_server之前,需要安裝以下依賴:

  1. sudo apt-get install uuid-dev  
  2. sudo apt-get install libglib2.0-dev  

如何運行

  1. 編寫實現代碼(eg:chatroom.c),需要包含頭文件 endpoint_impl.h
  2. 把實現代碼(eg:chatroom.c)放入examples目錄
  3. 編寫對應的html文件,放入static目錄
  4. 編輯Makefile文件
  5. 終端下運行make命令
  6. 然后敲入 ./socket.io_server 接口運行
  7. 打開瀏覽器即可訪問 (eg:http://localhost:8000/chatroom.html)

API說明

對外的API,可以在頭文件 endpoint_impl.h 看到其定義,其繼承了另外一個公用的頭文件 endpoint.h, 其完整定義為:

  1. #include <string.h>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4.  
  5. typedef struct {  
  6.     char *message_type;  
  7.     char *message_id;  
  8.     char *endpoint;  
  9.     char *message_data;  
  10.     char *ori_data;  
  11. } message_fields;  
  12.  
  13. typedef struct {  
  14.     char *endpoint;  
  15.     void (*on_init)(const char *endpoint);  
  16.     void (*on_connect)(const char *sessionid);  
  17.     void (*on_message)(const char *sessionid, const message_fields *msg_fields);  
  18.     void (*on_json_message)(const char *sessionid, const message_fields *msg_fields);  
  19.     void (*on_event)(const char *sessionid, const message_fields *msg_fields);  
  20.     void (*on_other)(const char *sessionid, const message_fields *msg_fields);  
  21.     void (*on_disconnect)(const char *sessionid, const message_fields *msg_fields);  
  22.     void (*on_destroy)(const char *endpoint);  
  23. } endpoint_implement;  
  24.  
  25. extern void send_msg(char *sessionid, char *message);  
  26. extern void broadcast_clients(char *except_sessionid, char *message);  
  27.  
  28. static void on_init(const char *endpoint);  
  29. static void on_connect(const char *sessionid);  
  30. static void on_message(const char *sessionid, const message_fields *msg_fields) {  
  31.     printf("on_message recevie ori msg is %s\n", msg_fields->ori_data);  
  32. }  
  33. static void on_json_message(const char *sessionid, const message_fields *msg_fields) {  
  34.     printf("on_json_message recevie ori msg is %s\n", msg_fields->ori_data);  
  35. }  
  36. static void on_other(const char *sessionid, const message_fields *msg_fields) {  
  37.     printf("on_other recevie ori msg is %s\n", msg_fields->ori_data);  
  38. }  
  39. static void on_event(const char *sessionid, const message_fields *msg_fields);  
  40. static void on_disconnect(const char *sessionid, const message_fields *msg_fields);  
  41. static void on_destroy(const char *endpoint);  
  42.  
  43. static endpoint_implement *init_default_endpoint_implement(char *endpoint_name) {  
  44.     endpoint_implement *impl_point = (endpoint_implement *)malloc(sizeof(endpoint_implement));  
  45.     impl_point->endpoint = strdup(endpoint_name);  
  46.  
  47.     impl_point->on_init = on_init;  
  48.     impl_point->on_connect = on_connect;  
  49.     impl_point->on_message = on_message;  
  50.     impl_point->on_json_message = on_json_message;  
  51.     impl_point->on_event = on_event;  
  52.     impl_point->on_other = on_other;  
  53.     impl_point->on_disconnect = on_disconnect;  
  54.     impl_point->on_destroy = on_destroy;  
  55.  
  56.     return impl_point;  

完整定義.

在example目錄中,你可以看到聊天室演示chatroom 和在線白板示范whiteboard .

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.    
  5. #include <glib.h>  
  6.    
  7. #include "../endpoint_impl.h"  
  8.    
  9. typedef struct {  
  10. char *event_name;  
  11. char *event_args;  
  12. } event_message;  
  13.    
  14. static char *event_message_reg = "{\"name\":\"(.*?)\",\"args\":\\[([^\\]]*?)\\]}";  
  15.    
  16. static gchar *get_match_result(GMatchInfo *match_info, gint index) {  
  17. gchar *match = g_match_info_fetch(match_info, index);  
  18. gchar *result = g_strdup(match);  
  19. g_free(match);  
  20.    
  21. return result;  
  22. }  
  23.    
  24. static void *message_2_struct(gchar *post_string, event_message *event_msg) {  
  25. GError *error = NULL;  
  26. GRegex *regex;  
  27. GMatchInfo *match_info;  
  28.    
  29. regex = g_regex_new(event_message_reg, 0, 0, &error );  
  30. g_regex_match( regex, post_string, 0, &match_info );  
  31.    
  32. if (g_match_info_matches(match_info)) {  
  33. event_msg->event_name = get_match_result(match_info, 1);  
  34. event_msg->event_args = get_match_result(match_info, 2);  
  35. else {  
  36. event_msg = NULL;  
  37. }  
  38.    
  39. g_match_info_free( match_info );  
  40. g_regex_unref( regex );  
  41.    
  42. return event_msg;  
  43. }  
  44.    
  45. static GHashTable *hashtable;  
  46.    
  47. static void hashtable_init(void) {  
  48. hashtable = g_hash_table_new(g_str_hash, g_str_equal);  
  49. }  
  50.    
  51. static void hashtable_add(const char *key, void *value) {  
  52. if (key) {  
  53. g_hash_table_insert(hashtable, g_strdup(key), value);  
  54. }  
  55. }  
  56.    
  57. static gboolean hashtable_remove(const char *key) {  
  58. if (key)  
  59. return g_hash_table_remove(hashtable, key);  
  60.    
  61. return 0;  
  62. }  
  63.    
  64. static void *hashtable_lookup(const char *key) {  
  65. if (key == NULL)  
  66. return NULL;  
  67. return g_hash_table_lookup(hashtable, key);  
  68. }  
  69.    
  70. /*static gint hashtable_size(void) {  
  71. return g_hash_table_size(hashtable);  
  72. }*/ 
  73.    
  74. static void hashtable_destroy(void) {  
  75. g_hash_table_destroy(hashtable);  
  76. }  
  77.    
  78. /**  
  79. ** use the struct to warpper the demo implment  
  80. **/ 
  81. static char *endpoint_name;  
  82. static void on_init(const char *endpoint) {  
  83. hashtable_init();  
  84. printf("%s has been inited now\n", endpoint);  
  85. endpoint_name = g_strdup(endpoint);  
  86. }  
  87.    
  88. static void on_connect(const char *sessionid) {  
  89. char messages[strlen(sessionid) + 50];  
  90. sprintf(messages, "5::%s:{\"name\":\"clientId\",\"args\":[{\"id\":\"%s\"}]}", endpoint_name, sessionid);  
  91.    
  92. send_msg(sessionid, messages);  
  93. }  
  94.    
  95. static void send_it(char *session_id, char *messaage) {  
  96. send_msg(session_id, messaage);  
  97. }  
  98.    
  99. static void free_event_msg(event_message *event_msg) {  
  100. free(event_msg->event_name);  
  101. free(event_msg->event_args);  
  102. }  
  103.    
  104. static void on_event(const char *sessionid, const message_fields *msg_fields) {  
  105. event_message event_msg;  
  106. if (!message_2_struct(msg_fields->message_data, &event_msg)) {  
  107. fprintf(stderr, "%s Parse Message Error !\n", msg_fields->ori_data);  
  108. return;  
  109. }  
  110.    
  111. if (!strcmp(event_msg.event_name, "roomNotice")) {  
  112. /*5::/whiteboard:{"name":"roomNotice","args":[{"room":"myRoom"}]}*/ 
  113. char target_room_id[strlen(event_msg.event_args) - 10];// = event_msg.event_args + 9;  
  114. strncpy(target_room_id, event_msg.event_args + 9, strlen(event_msg.event_args) - 11);  
  115.    
  116. GPtrArray *list = (GPtrArray *)hashtable_lookup(target_room_id);  
  117. if (list == NULL) {  
  118. list = g_ptr_array_new();  
  119. hashtable_add(target_room_id, list);  
  120. }  
  121. g_ptr_array_add(list, g_strdup(sessionid));  
  122.    
  123. int room_count = list->len;  
  124. char messages[strlen(sessionid) + 200];  
  125. sprintf(messages, "5::%s:{\"name\":\"roomCount\",\"args\":[{\"room\":\"%s\",\"num\":%d}]}", endpoint_name, target_room_id, room_count);  
  126.    
  127. hashtable_add(g_strdup(sessionid), g_strdup(target_room_id));  
  128. g_ptr_array_foreach(list, (GFunc)send_it, messages);  
  129. free_event_msg(&event_msg);  
  130. return;  
  131. }  
  132.    
  133. char messages[strlen(msg_fields->ori_data) + 200];  
  134. sprintf(messages, "5::%s:{\"name\":\"%s\",\"args\":[%s]}", endpoint_name, event_msg.event_name, event_msg.event_args);  
  135. free_event_msg(&event_msg);  
  136. char *target_room_id = (char *)hashtable_lookup(sessionid);  
  137. GPtrArray *list = (GPtrArray *)hashtable_lookup(target_room_id);  
  138. if(list == NULL){  
  139. return;  
  140. }  
  141.    
  142. int i;  
  143. for (i = 0; i < list->len; i++) {  
  144. char *session_id = g_ptr_array_index(list, i);  
  145. if (strcmp(session_id, sessionid) == 0)  
  146. continue;  
  147.    
  148. send_msg(session_id, messages);  
  149. }  
  150.    
  151. }  
  152.    
  153. static void on_disconnect(const char *sessionid, const message_fields *msg_fields) {  
  154. char *room_id = (char *)hashtable_lookup(sessionid);  
  155. if (room_id == NULL) {  
  156. fprintf(stderr, "the room_id is NULL\n");  
  157. return;  
  158. }  
  159.    
  160. char notice_msg[strlen(endpoint_name) + strlen(room_id) + 70];  
  161. GPtrArray *list = (GPtrArray *)hashtable_lookup(room_id);  
  162. sprintf(notice_msg, "5::%s:{\"name\":\"roomCount\",\"args\":[{\"room\":\"%s\",\"num\":%d}]}", endpoint_name, room_id, list->len - 1);  
  163. int i, remove_index;  
  164. for (i = 0; i < list->len; i++) {  
  165. char *session_id = g_ptr_array_index(list, i);  
  166. if (strcmp(session_id, sessionid) == 0) {  
  167. remove_index = i;  
  168. continue;  
  169. }  
  170.    
  171. send_msg(session_id, notice_msg);  
  172. }  
  173. g_ptr_array_remove_index(list, remove_index);  
  174.    
  175. hashtable_remove(sessionid);  
  176. free(room_id);  
  177. }  
  178.    
  179. static void on_destroy(const char *endpoint) {  
  180. printf("%s has been destroy now\n", endpoint);  
  181. hashtable_destroy();  
  182. free(endpoint_name);  
  183. }  
  184.    
  185. extern endpoint_implement *init_whiteboard_endpoint_implement(char *endpoint_name) {  
  186. return init_default_endpoint_implement(endpoint_name);  

因為C語言中沒有散列表,只好借助于成熟的glib庫實現。

其它

項目不太成熟,期待大家的參與,您的建議、批評和指正,都是一種激勵,再次表示感謝。

原文鏈接:http://www.blogjava.net/yongboy/archive/2013/03/15/396493.html

責任編輯:林師授 來源: 聶永的博客
相關推薦

2017-09-05 15:30:00

JavascriptSocket.ioNode.js

2012-08-01 14:16:27

IBMdW

2009-08-21 17:39:20

服務器端程序C#網絡編程

2018-03-15 09:54:45

php服務器端語言

2010-03-23 10:04:00

JavaScript

2009-08-21 14:34:34

C#服務器端表達式

2013-12-25 11:01:16

JavaScript

2012-10-15 13:40:15

IBMdw

2014-01-15 10:06:30

vFlash

2014-07-22 10:29:04

背包算法coffee

2022-06-13 07:33:57

socketReact組件

2015-10-27 09:40:31

TCPIP網絡協議

2010-08-27 10:23:26

DHCP服務器

2010-06-02 19:40:55

搭建SVN版本庫服務器

2014-11-14 11:03:56

微軟.NET

2023-06-30 08:00:00

漏洞網絡安全SSTI

2017-12-06 22:29:53

2011-06-07 16:01:46

Android 服務器 數據交互

2015-11-04 14:14:56

HTTP網絡協議

2019-07-26 14:40:58

Vue.jsSocket.IO前端
點贊
收藏

51CTO技術棧公眾號

欧美视频在线观看视频| 欧美在线xxx| 又色又爽又高潮免费视频国产| 亚洲精品免费在线观看视频| 国产一区久久| 精品日韩99亚洲| 国产午夜大地久久| 黄色电影免费在线看| 秋霞影院一区二区| 免费91在线视频| 国产在线观看无码免费视频| 福利一区二区免费视频| 99久久伊人精品| 国产成人小视频在线观看| 四虎永久免费影院| 日本一区二区三区中文字幕| 亚洲人成7777| 精品一区久久久| 国产精品传媒在线观看| 一区二区三区网站| 亚洲美女精品久久| 在线免费黄色网| rebdb初裸写真在线观看| 波多野结衣视频一区| 国产精品久久久久久久久借妻| 91久久国产综合| 台湾亚洲精品一区二区tv| 亚洲不卡一区二区三区| 欧洲成人一区二区| av男人天堂av| 久久一日本道色综合久久| 蜜月aⅴ免费一区二区三区| 免费看污黄网站在线观看| 台湾天天综合人成在线| 大桥未久av一区二区三区| 超碰成人在线免费观看| 男女污污视频在线观看| 国产精品一区二区免费不卡| 午夜精品在线视频| 三级黄色在线观看| 欧美亚视频在线中文字幕免费| 欧美疯狂做受xxxx富婆| 久久综合色视频| 18视频在线观看| 欧美国产精品久久| 久久99精品久久久久久秒播放器| 国产精品久久久久久69| 久久久蜜桃一区二区人| 国模视频一区二区| 1024手机在线视频| 久久精品国产大片免费观看| 精品网站999www| 韩国av中国字幕| **精品中文字幕一区二区三区| 色综合天天性综合| 欧美亚洲另类色图| 国产v日韩v欧美v| 亚洲一区二区三区在线看| 日本午夜精品一区二区| 亚洲国产精品国自产拍久久| 精品综合久久久久久8888| 国产精品91在线| 中文字字幕在线中文| 黄色亚洲在线| 一个色综合导航| 国产成人精品无码免费看夜聊软件| 免费一区二区三区在线视频| 欧美精品123区| 91高清国产视频| 国产精品亚洲一区二区三区在线观看| 亚洲高清在线精品| 东北少妇不带套对白| 婷婷成人激情| 国产精品入口麻豆九色| 神马影院我不卡| av资源种子在线观看| 中文字幕第一区二区| 久久精品欧美| 国产天堂在线| 国产视频一区在线播放| 欧洲一区二区在线观看| caoporn国产精品免费视频| 国产精品伦一区二区三级视频| 亚洲国产精品视频一区| 中文字幕日本在线| 国产精品久久二区二区| 性做爰过程免费播放| 在线观看小视频| 亚洲国产激情av| 91蜜桃免费观看视频| 国产精品美女久久久久久免费| 久久久久免费看| 好看的av在线不卡观看| 久久久久久国产三级电影| 久久99久久久| 99精品国产在热久久下载| 日本欧美精品在线| 成人免费一区二区三区| 久久久久国产精品一区二区| 日韩免费观看视频| 伊人免费在线观看| 国产在线精品一区二区三区不卡| yellow视频在线观看一区二区| 色呦呦中文字幕| 国产日产欧产精品推荐色 | 一本加勒比北条麻妃| 九色精品91| 久久久国产在线视频| 国产在线拍揄自揄拍| 免费看的黄色欧美网站| 亚洲成人一品| 日韩精品小视频| 超碰手机在线观看| 老妇喷水一区二区三区| 都市激情久久久久久久久久久| 成人免费一区二区三区视频网站| 一片黄亚洲嫩模| 一道本视频在线观看| 偷窥自拍亚洲色图精选| 欧美黑人视频一区| 在线免费观看中文字幕| 91麻豆123| 性欧美大战久久久久久久| 精品麻豆剧传媒av国产九九九| 亚洲欧美日韩在线一区| 豆国产97在线 | 亚洲| 狠狠色丁香婷综合久久| 欧洲精品码一区二区三区免费看| 阿v视频在线| 日韩一级大片在线观看| www.99re6| 日韩国产精品久久久久久亚洲| 国产一区视频观看| 日韩伦理av| 日韩午夜激情av| 人妻久久一区二区| 久久成人免费网| 亚洲精品久久久久久一区二区| 日韩国产激情| 亚洲无亚洲人成网站77777| wwwxxx亚洲| 97se亚洲国产综合自在线| 日韩在线视频在线| 亚洲一区二区电影| 欧美国产乱视频| 亚洲精品视频专区| 亚洲一区在线观看网站| 国产又黄又嫩又滑又白| 影音先锋成人在线电影| 成人在线免费观看视视频| www.久久热.com| 欧美自拍丝袜亚洲| 国产精品理论在线| 麻豆传媒一区二区三区| 影音先锋欧美在线| 国产亚洲久久| 精品中文字幕视频| 殴美一级特黄aaaaaa| 精品magnet| 久久久久久久久久久国产精品| 天堂成人国产精品一区| 视频一区二区在线| 在线免费观看亚洲| 欧美伦理91i| 亚洲av成人无码网天堂| 色噜噜狠狠色综合中国| 少妇愉情理伦三级| 国产一区 二区 三区一级| 国产制服91一区二区三区制服| 综合伊人久久| 97精品在线观看| 国产在线一在线二| 欧美福利一区二区| 精品在线视频免费观看| 91蜜桃网址入口| 天天干天天草天天| 欧美激情综合| 欧美极品一区二区| 香蕉久久久久久| 久久久女人电视剧免费播放下载| av在线网址导航| 日本一区二区免费高清| 91免费观看网站| 欧美伦理91| 精品国产一区二区三区久久久 | 日本成人免费视频| 国产综合色在线| www国产精品内射老熟女| av一区二区高清| 国产精品国产精品国产专区蜜臀ah| 午夜影院在线播放| 伦伦影院午夜日韩欧美限制| 五月婷中文字幕| 欧美精品 日韩| 九九热在线免费观看| 1024成人网| 黄色在线观看av| 国产精品一二三四五| 丁香啪啪综合成人亚洲| 在线国产一区| 日韩久久不卡| 福利在线一区| 91精品久久久久久久久中文字幕 | 亚洲v日本v欧美v久久精品| 中文字幕av久久爽一区| 成人亚洲一区二区一| 亚洲福利精品视频| 99精品国产福利在线观看免费| 午夜午夜精品一区二区三区文| 精品国内亚洲2022精品成人| 成人a级免费视频| 综合日韩av| 欧美激情免费在线| 国产在线观看免费麻豆| 亚洲精品之草原avav久久| 国产欧美熟妇另类久久久| 色又黄又爽网站www久久| 久久久久97国产| 国产精品美女久久久久高潮| 国产麻豆天美果冻无码视频| 国产成人自拍网| 不用播放器的免费av| 日韩电影免费在线看| 久久综合九色综合88i| 欧美成熟视频| 中文字幕超清在线免费观看| 第九色区aⅴ天堂久久香| 久久久国产精品一区二区三区| 欧美经典一区| 91午夜理伦私人影院| 久久青草免费| 国产精品美女免费看| 欧美大胆成人| 欧美重口另类videos人妖| 99在线视频影院| 高清在线视频日韩欧美| 天堂va在线| 色综合天天综合网国产成人网| 黄视频网站在线| 日韩一区二区三区在线播放| 天堂аⅴ在线地址8| 在线观看中文字幕亚洲| 嫩草精品影院| 亚洲一二在线观看| 国产综合在线观看| 尤物九九久久国产精品的分类| 青青草在线视频免费观看| 国产视频丨精品|在线观看| 熟妇人妻系列aⅴ无码专区友真希| 精品少妇一区二区三区在线播放| 精品人妻一区二区三区三区四区| 日韩欧美一区二区免费| 性做久久久久久久久久| 精品国精品国产| 日日躁夜夜躁白天躁晚上躁91| 亚洲国产精品成人精品| 天堂a中文在线| 一区二区三区视频在线| 丝袜美腿美女被狂躁在线观看| 日韩一区视频在线| free性欧美hd另类精品| 久久久久久国产精品美女| 国产精品蜜芽在线观看| 欧美一区二区三区…… | 国产精品日韩一区二区三区 | 日韩高清有码在线| 牛牛影视精品影视| 色综合伊人色综合网站| 在线免费观看污| 69视频在线播放| 国产精品天堂蜜av在线播放| 92裸体在线视频网站| 超碰成人在线观看| 日韩精品久久一区| 五月天久久777| 777精品久无码人妻蜜桃| 麻豆9191精品国产| 国产无遮挡猛进猛出免费软件 | 欧美日韩亚洲综合一区 | 亚洲欧美日韩精品久久| 一级毛片视频在线观看| 欧美国产在线视频| 肉色欧美久久久久久久免费看| 成人午夜高潮视频| 免费萌白酱国产一区二区三区| 亚洲成人精品电影在线观看| 欧美在线网址| av丝袜天堂网| 成人一级片在线观看| 一级特黄曰皮片视频| 一区二区三区欧美日| 国产精品第5页| 91精品国产色综合久久不卡蜜臀 | 视频精品一区| 欧美日韩一区二区三区免费| 欧美99久久| 亚洲免费av一区二区三区| 成人免费毛片app| 内射毛片内射国产夫妻| 亚洲国产日韩在线一区模特| 在线播放一级片| 亚洲精品av在线播放| 米奇精品一区二区三区| 奇米4444一区二区三区| 日韩欧美中文字幕在线视频 | 男人资源在线播放| 1769国产精品| 中文字幕日韩高清在线| 色综合影院在线观看| 国产精品亚洲产品| 中文字幕avav| 国产精品乱码久久久久久| 国产欧美一区二区三区在线看蜜臂| 欧美一区二区三区在线| 电影av一区| 热久久免费视频精品| 超碰97成人| 国产一区二区三区在线免费| 麻豆精品在线播放| 精品人妻互换一区二区三区| 亚洲一区二区三区在线看| 国产精品久久久久久在线| 亚洲一级黄色片| 日韩精品99| 欧美下载看逼逼| 国产精品亚洲综合久久| 50一60岁老妇女毛片| 夜夜操天天操亚洲| 国产强伦人妻毛片| 久久精品99久久香蕉国产色戒| 澳门av一区二区三区| 蜜桃av噜噜一区二区三| 亚洲一区观看| 亚洲精品女人久久久| 天天综合天天做天天综合| 二区三区在线视频| 欧美日韩成人在线观看| 麻豆视频久久| 日本一二三区视频在线| 国产精品一区二区三区四区| 亚洲国产美女视频| 欧美一区永久视频免费观看| 国产不卡在线| 99porn视频在线| 在线欧美三区| 国产精品无码网站| 日韩欧美国产一区二区| 青青久草在线| 国产精品啪视频| 国产精品99视频| 欧美熟妇另类久久久久久多毛| 亚洲精品视频在线观看网站| 国产成人毛毛毛片| 久久久久久91| 五月天亚洲一区| 久久久久久三级| 国产精品国产三级国产普通话三级 | 色婷婷av一区二区三区大白胸 | 国产三级精品在线观看| 不卡av电影院| 红杏成人性视频免费看| 97国产精东麻豆人妻电影| 久久久精品蜜桃| 亚洲手机在线观看| 欧美精品免费播放| 激情视频极品美女日韩| 久久久久久久少妇| 国产精品久久久久一区二区三区| 高清国语自产拍免费一区二区三区| 91啦中文在线| 国产欧美精品一区二区| 亚洲欧美一级二级三级| 亚洲欧美日韩色| 91九色最新地址| www在线免费观看视频| 国产精品18毛片一区二区| 国产日韩亚洲| 天堂网av2018| 亚洲成av人乱码色午夜| 亚洲高清黄色| 九一免费在线观看| 91蜜桃在线观看| 国产毛片在线视频| 91超碰caoporn97人人| 日韩欧美综合| 亚洲天堂av网站| 欧美人与z0zoxxxx视频| а√天堂中文资源在线bt| 亚洲欧洲国产精品久久| 成人小视频在线观看| 亚洲av无码乱码国产精品fc2| 欧美大片欧美激情性色a∨久久| 深爱激情综合| 日韩av成人网| 欧美性受极品xxxx喷水| 丁香花在线高清完整版视频| 先锋影音一区二区三区| 成人va在线观看| 国产一区二区三区在线观看| 日本欧美中文字幕|