99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Linux C語(yǔ)言局域網(wǎng)聊天室:從Socket到多線程并發(fā)實(shí)現(xiàn)

Linux C語(yǔ)言局域網(wǎng)聊天室:從Socket到多線程并發(fā)實(shí)現(xiàn) 簡(jiǎn)介一份基于Linux平臺(tái)、使用C語(yǔ)言實(shí)現(xiàn)的局域網(wǎng)聊天室源碼包面向網(wǎng)絡(luò)編程初學(xué)者以及課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)的學(xué)生演示如何通過(guò)TCP/IP與多線程機(jī)制構(gòu)建一個(gè)小型局域網(wǎng)聊天服務(wù)。源碼采用客戶(hù)端與服務(wù)器分離模式完整實(shí)現(xiàn)消息群發(fā)、歷史數(shù)據(jù)查詢(xún)、好友列表管理、好友上下線提醒等常用功能其中涉及套接字通信、多客戶(hù)端并發(fā)處理、在線狀態(tài)廣播、聊天記錄存儲(chǔ)與檢索等關(guān)鍵知識(shí)點(diǎn)兼具可讀性與可擴(kuò)展性。壓縮包共七個(gè)文件主要包括三個(gè)C源文件、一個(gè)頭文件、一個(gè)Makefile構(gòu)建腳本、一份txt說(shuō)明文檔以及一份docx版程序設(shè)計(jì)文檔整體大小僅六十四KB內(nèi)容精煉解壓后可直接閱讀和編譯。附帶的設(shè)計(jì)文檔能幫助理解各模塊的設(shè)計(jì)思路便于對(duì)照源碼深入調(diào)試與二次開(kāi)發(fā)。目前已有100人學(xué)習(xí)下載適合通過(guò)實(shí)際項(xiàng)目掌握Linux網(wǎng)絡(luò)編程、多線程協(xié)作以及基礎(chǔ)協(xié)議應(yīng)用并可根據(jù)需要進(jìn)一步添加私聊、文件傳輸?shù)刃鹿δ堋?. 從Socket到聊天室為什么這個(gè)項(xiàng)目值得動(dòng)手拆一遍不少人在學(xué)完Linux網(wǎng)絡(luò)編程后卡在同一個(gè)地方read函數(shù)會(huì)阻塞、write返回值不檢查、多線程下共享變量亂改這些零散知識(shí)點(diǎn)單獨(dú)看都能理解一拼成完整的聊天室就四處漏風(fēng)。這個(gè)基于Linux使用C語(yǔ)言實(shí)現(xiàn)的局域網(wǎng)聊天室源碼恰好把網(wǎng)絡(luò)編程的核心鏈路串起來(lái)了——TCP連接管理、多線程并發(fā)、消息廣播、歷史記錄落盤(pán)、上下線狀態(tài)通知。它不做花哨的界面全部走終端交互反而能讓注意力集中在數(shù)據(jù)傳輸和處理邏輯上。適合剛啃完APUE卷socket章節(jié)的學(xué)生也適合想快速回顧select/poll之前那套經(jīng)典多線程模型的在職開(kāi)發(fā)。配套的docx文檔把設(shè)計(jì)思路寫(xiě)得很直白源代碼結(jié)構(gòu)簡(jiǎn)單到可以直接從頭讀完改造成自己項(xiàng)目的通信底層也非常方便。下面我按實(shí)際拆源碼的順序把協(xié)議設(shè)計(jì)、服務(wù)器端并發(fā)模型、客戶(hù)端交互和歷史查詢(xún)這幾塊逐一說(shuō)明。2. TCP選型、數(shù)據(jù)幀格式與多線程模型2.1 為什么局域網(wǎng)即時(shí)通訊首選TCP而非UDP聊天室最基礎(chǔ)的需求是“消息不能丟”。UDP雖然省去了握手和?;畹穆闊┑钟蚓W(wǎng)環(huán)境下的丟包率雖然低客戶(hù)端突然掉線時(shí)UDP根本無(wú)從感知服務(wù)器維護(hù)在線列表會(huì)變得十分不可靠。TCP提供的流式傳輸和連接狀態(tài)檢測(cè)能讓服務(wù)器立刻通過(guò)read返回0或errno發(fā)現(xiàn)對(duì)端關(guān)閉這是實(shí)現(xiàn)“好友上下線提醒”的前提。另一個(gè)原因是代碼復(fù)雜度TCP的accept、recv、send接口更直觀多線程模型下每個(gè)連接一個(gè)fd邏輯邊界清晰。如果你練習(xí)過(guò)UDP的sendto循環(huán)就知道要在業(yè)務(wù)層自己實(shí)現(xiàn)確認(rèn)和重傳那工作量已經(jīng)接近重寫(xiě)一個(gè)迷你TCP了。局域網(wǎng)場(chǎng)景下帶寬充足TCP頭部開(kāi)銷(xiāo)幾乎不影響體驗(yàn)所以這個(gè)項(xiàng)目選TCP是合理且務(wù)實(shí)的。2.2 自定義協(xié)議幀消息頭和消息體分離源碼中的common.h定義了通信雙方約定的報(bào)文格式這是整個(gè)聊天室的技術(shù)地基。協(xié)議設(shè)計(jì)為固定長(zhǎng)度頭部加上變長(zhǎng)消息體避免粘包和半包。#define MSG_MAX_LEN 1024 #define NAME_MAX_LEN 32 typedef enum { MSG_TYPE_BROADCAST 1, // 群發(fā)消息 MSG_TYPE_HISTORY, // 歷史記錄請(qǐng)求/響應(yīng) MSG_TYPE_ONLINE_LIST, // 在線列表查詢(xún) MSG_TYPE_LOGIN, // 登錄通知 MSG_TYPE_LOGOUT, // 退出通知 MSG_TYPE_PRIVATE // 預(yù)留的私聊消息 } msg_type_t; typedef struct { int type; // 消息類(lèi)型見(jiàn)msg_type_t int from_len; // 發(fā)送者名字長(zhǎng)度 int body_len; // 消息體長(zhǎng)度 } msg_header_t; typedef struct { msg_header_t header; char from[NAME_MAX_LEN]; // 發(fā)送者名字 char body[MSG_MAX_LEN]; // 消息內(nèi)容 } chat_message_t;頭部的三個(gè)int字段用定長(zhǎng)方式傳輸接收方先讀滿12字節(jié)的msg_header_t再?gòu)膄rom_len和body_len得知后續(xù)需要讀取多少字節(jié)。這種設(shè)計(jì)的好處是解析時(shí)不需要掃描整個(gè)數(shù)據(jù)流找分隔符效率高也不會(huì)誤拆中文內(nèi)容。注意msg_header_t沒(méi)有使用#pragma pack或__attribute__((packed))這是因?yàn)樵诰W(wǎng)絡(luò)傳輸中發(fā)送方和接收方可能在不同的Linux發(fā)行版上編譯結(jié)構(gòu)體默認(rèn)對(duì)齊可能產(chǎn)生額外填充字節(jié)。更穩(wěn)妥的做法是像項(xiàng)目里這樣把各字段單獨(dú)發(fā)送或者將頭部字段統(tǒng)一為網(wǎng)絡(luò)字節(jié)序的uint32_t。我在自己的代碼里會(huì)額外增加一個(gè)magic字段用于校驗(yàn)防止把錯(cuò)誤的數(shù)據(jù)流當(dāng)成消息處理。2.3 多線程與多進(jìn)程的選擇客戶(hù)端連接處理項(xiàng)目采用一連接一線程thread-per-connection模型服務(wù)器主線程執(zhí)行accept循環(huán)每接受一個(gè)新的客戶(hù)端連接就創(chuàng)建一個(gè)pthread_t線程專(zhuān)門(mén)處理該連接。相比f(wàn)ork子進(jìn)程線程共享進(jìn)程地址空間操作同一份在線鏈表和消息計(jì)數(shù)不需要借助IPC直接加鎖讀寫(xiě)即可。代價(jià)是一個(gè)線程棧默認(rèn)約8MB如果客戶(hù)端數(shù)量達(dá)到數(shù)百虛擬內(nèi)存壓力會(huì)比較大。對(duì)于局域網(wǎng)聊天室這種幾十人量級(jí)的場(chǎng)景這是最清晰的并發(fā)方案。void *client_handler(void *arg) { int client_fd *(int *)arg; char peer_ip[INET_ADDRSTRLEN]; // ... 獲取客戶(hù)端IP加入在線列表 ... chat_message_t msg; while (1) { memset(msg, 0, sizeof(msg)); // 分兩次讀取先讀頭再讀體 if (recv(client_fd, msg.header, sizeof(msg.header), 0) 0) break; if (recv(client_fd, msg.from, msg.header.from_len, 0) 0) break; if (recv(client_fd, msg.body, msg.header.body_len, 0) 0) break; handle_message(client_fd, msg); // 根據(jù)type分發(fā)處理 } remove_client(client_fd); pthread_detach(pthread_self()); close(client_fd); return NULL; }recv三次變長(zhǎng)讀取減少了粘包概率但沒(méi)完全解決如果網(wǎng)絡(luò)出現(xiàn)半包第二次recv可能只收到一部分。嚴(yán)謹(jǐn)?shù)膶?xiě)法是循環(huán)讀取直到收滿所需字節(jié)我在改進(jìn)時(shí)會(huì)封裝一個(gè)readn函數(shù)。另外需要注意線程參數(shù)arg指向的client_fd是棧上變量所以建議用堆上分配的方式傳參否則主線程繼續(xù)循環(huán)時(shí)可能修改同一塊內(nèi)存。源碼里用malloc分配新fd副本再傳入這點(diǎn)值得學(xué)習(xí)。3. 服務(wù)器端消息群發(fā)、在線列表與上下線通知3.1 服務(wù)器核心數(shù)據(jù)結(jié)構(gòu)與鎖維護(hù)在線客戶(hù)端需要一張全局鏈表每個(gè)節(jié)點(diǎn)保存fd、昵稱(chēng)、IP等。由于多線程同時(shí)讀寫(xiě)這張表必須用互斥鎖保護(hù)。源碼中在clientlist.c里實(shí)現(xiàn)了這個(gè)結(jié)構(gòu)插入和刪除都封裝成獨(dú)立函數(shù)。typedef struct client_node { int fd; char name[NAME_MAX_LEN]; struct sockaddr_in addr; struct client_node *next; } client_node_t; static client_node_t *head NULL; static pthread_mutex_t clients_mutex PTHREAD_MUTEX_INITIALIZER; void add_client(client_node_t *node) { pthread_mutex_lock(clients_mutex); node-next head; head node; pthread_mutex_unlock(clients_mutex); } void remove_client(int fd) { pthread_mutex_lock(clients_mutex); client_node_t *cur head, *prev NULL; while (cur) { if (cur-fd fd) { if (prev) prev-next cur-next; else head cur-next; free(cur); break; } prev cur; cur cur-next; } pthread_mutex_unlock(clients_mutex); }加鎖粒度要控制好。很多新手會(huì)把整個(gè)廣播循環(huán)也放在鎖內(nèi)導(dǎo)致一次慢客戶(hù)端拖住所有發(fā)送。正確做法是在遍歷時(shí)先鎖住鏈表然后逐個(gè)取出fd并調(diào)用sendsend是阻塞操作可能耗時(shí)長(zhǎng)所以應(yīng)該在取到fd后盡快解鎖。比較穩(wěn)妥的方式是用引用計(jì)數(shù)或淺拷貝的方式拿一份fd數(shù)組出來(lái)然后釋放鎖再執(zhí)行send。3.2 消息廣播與上下線提醒的實(shí)現(xiàn)廣播函數(shù)遍歷所有在線節(jié)點(diǎn)將收到的消息原樣轉(zhuǎn)發(fā)給除自己外的其他客戶(hù)端。上下線提醒本質(zhì)上是廣播一條特殊類(lèi)型的系統(tǒng)消息只是消息體寫(xiě)的是“xx上線了”。void broadcast_message(chat_message_t *msg, int sender_fd) { pthread_mutex_lock(clients_mutex); client_node_t *cur head; while (cur) { if (cur-fd ! sender_fd) { ssize_t sent send(cur-fd, msg, sizeof(*msg), 0); if (sent -1) { // 發(fā)送失敗通常會(huì)走到remove_client流程 perror(send error); } } cur cur-next; } pthread_mutex_unlock(clients_mutex); } void notify_status(const char *name, int online) { chat_message_t sys_msg; memset(sys_msg, 0, sizeof(sys_msg)); sys_msg.header.type online ? MSG_TYPE_LOGIN : MSG_TYPE_LOGOUT; sys_msg.header.from_len strlen(name); snprintf(sys_msg.body, sizeof(sys_msg.body), %s, online ? 上線了 : 下線了); sys_msg.header.body_len strlen(sys_msg.body); strncpy(sys_msg.from, name, NAME_MAX_LEN); broadcast_message(sys_msg, -1); }注意broadcast_message用sender_fd -1來(lái)表示系統(tǒng)廣播這樣所有客戶(hù)端都會(huì)收到。上下線提醒應(yīng)該在客戶(hù)端加入鏈表之前發(fā)送還是之后發(fā)送如果先發(fā)通知再插入鏈表其他客戶(hù)端無(wú)法看到這位新用戶(hù)因?yàn)榘l(fā)送通知時(shí)他還沒(méi)在列表里。正確順序是先插入鏈表再?gòu)V播上線的同時(shí)廣播一份在線列表給所有客戶(hù)端。這樣收到上線通知的客戶(hù)端可以主動(dòng)向新用戶(hù)問(wèn)好而新用戶(hù)也能立刻拿到完整的成員名單。源碼main.c里就是按這個(gè)順序處理的。3.3 歷史數(shù)據(jù)查詢(xún)的服務(wù)端存儲(chǔ)策略源碼將聊天記錄保存在一個(gè)普通文本文件chat.log中。每個(gè)廣播或私聊消息在轉(zhuǎn)發(fā)的同時(shí)同步追加寫(xiě)入文件。查詢(xún)歷史時(shí)客戶(hù)端發(fā)送MSG_TYPE_HISTORY類(lèi)型消息服務(wù)器打開(kāi)文件讀出全部?jī)?nèi)容通過(guò)send返回給客戶(hù)端。寫(xiě)入時(shí)要注意多線程寫(xiě)文件的原子性。兩個(gè)線程同時(shí)調(diào)用write到同一文件描述符如果消息長(zhǎng)度不超過(guò)PIPE_BUFLinux下4096字節(jié)內(nèi)核會(huì)保證write系統(tǒng)調(diào)用是原子的。這里每條消息通常不到幾百字節(jié)所以直接用write追加問(wèn)題不大。更穩(wěn)妥的做法是給文件寫(xiě)操作單獨(dú)加一把鎖或讓所有寫(xiě)入集中在專(zhuān)門(mén)的日志線程。我建議在關(guān)鍵函數(shù)里加鎖因?yàn)槿绻褀rite放在broadcast的循環(huán)里廣播期間的任何失敗都會(huì)影響寫(xiě)日志。void append_history(chat_message_t *msg) { FILE *fp fopen(chat.log, a); if (!fp) { perror(fopen chat.log); return; } fprintf(fp, [%ld] %s: %s\n, time(NULL), msg-from, msg-body); fclose(fp); }每次打開(kāi)和關(guān)閉文件會(huì)有開(kāi)銷(xiāo)但對(duì)聊天室這種低頻寫(xiě)入完全可接受。開(kāi)發(fā)環(huán)境里用fopen/fclose能保證數(shù)據(jù)立即落盤(pán)避免緩沖區(qū)滯留。查詢(xún)時(shí)使用fgets逐行讀取并拼接通過(guò)send一次性或分段發(fā)送給請(qǐng)求者。還記得MSG_MAX_LEN為1024嗎如果歷史文件超過(guò)這個(gè)長(zhǎng)度服務(wù)器端要拆包發(fā)送客戶(hù)端則需要循環(huán)接收。源碼里直接用了定長(zhǎng)數(shù)組返回這個(gè)在長(zhǎng)聊天記錄下會(huì)截?cái)辔覍?shí)測(cè)后把發(fā)送邏輯改成了按行拆包。4. 客戶(hù)端實(shí)現(xiàn)交互線程、好友列表與本地記錄4.1 客戶(hù)端主流程與雙線程結(jié)構(gòu)客戶(hù)端程序main.c的主函數(shù)邏輯清晰創(chuàng)建socket、connect到服務(wù)器、啟動(dòng)接收線程處理來(lái)自服務(wù)器的數(shù)據(jù)同時(shí)主線程循環(huán)讀取用戶(hù)輸入并發(fā)送。接收線程的存在是為了及時(shí)處理廣播消息、上下線提醒、在線列表更新等異步事件避免用戶(hù)正輸入時(shí)錯(cuò)過(guò)消息。void *recv_thread(void *arg) { int sock_fd *(int *)arg; chat_message_t msg; while (1) { int n recv(sock_fd, msg, sizeof(msg), 0); if (n 0) { printf(服務(wù)器連接已斷開(kāi)\n); exit(EXIT_FAILURE); } switch (msg.header.type) { case MSG_TYPE_BROADCAST: printf(\n[%s] %s\n, msg.from, msg.body); break; case MSG_TYPE_ONLINE_LIST: printf(當(dāng)前在線用戶(hù)\n%s\n, msg.body); break; case MSG_TYPE_LOGIN: printf( %s 上線了\n, msg.from); break; case MSG_TYPE_LOGOUT: printf( %s 下線了\n, msg.from); break; case MSG_TYPE_HISTORY: printf(-----歷史記錄-----\n%s\n, msg.body); break; default: break; } printf( ); fflush(stdout); } return NULL; }注意接收線程里printf之后要重新打印提示符并刷新stdout否則用戶(hù)正在輸入的內(nèi)容會(huì)和消息混在一起。這里有個(gè)小技巧在printf消息前輸出換行消息結(jié)束后再打印“ ”提示符并fflush這樣即使主線程正在等待輸入用戶(hù)也能看到新消息插入且自己的輸入內(nèi)容不會(huì)被沖掉。真正的控制臺(tái)聊天室還會(huì)加ncurses庫(kù)做獨(dú)立輸入?yún)^(qū)但這個(gè)項(xiàng)目的終端交互方式對(duì)學(xué)習(xí)socket更友好。4.2 好友列表查看與上下線狀態(tài)維護(hù)服務(wù)器返回在線列表的方式有兩種一種是指令觸發(fā)時(shí)服務(wù)器遍歷鏈表拼裝字符串另一種是每次客戶(hù)端登錄或退出時(shí)服務(wù)器主動(dòng)推送最新列表。源碼采用后者好處是客戶(hù)端無(wú)需主動(dòng)請(qǐng)求就能維持較新的好友狀態(tài)視圖??蛻?hù)端側(cè)只需要在收到MSG_TYPE_ONLINE_LIST時(shí)用strtok按換行符拆分然后更新本地的一個(gè)char online_names[][NAME_MAX_LEN]數(shù)組即可。void update_online_list(const char *data) { memset(online_names, 0, sizeof(online_names)); online_count 0; char tmp[MSG_MAX_LEN]; strncpy(tmp, data, sizeof(tmp) - 1); char *token strtok(tmp, \n); while (token online_count MAX_CLIENTS) { strncpy(online_names[online_count], token, NAME_MAX_LEN - 1); token strtok(NULL, \n); } }注意strtok會(huì)修改原字符串所以必須先復(fù)制一份data。判斷一個(gè)好友是否在線只需遍歷online_names下線則意味著列表中沒(méi)有對(duì)應(yīng)名字。這個(gè)設(shè)計(jì)不需要客戶(hù)端維護(hù)好友關(guān)系數(shù)據(jù)庫(kù)一切以服務(wù)器廣播的列表為準(zhǔn)屬于無(wú)狀態(tài)模式。壞處是如果客戶(hù)端錯(cuò)過(guò)了某次列表推送會(huì)導(dǎo)致?tīng)顟B(tài)不準(zhǔn)確所以還需要一個(gè)主動(dòng)查詢(xún)指令也就是發(fā)送MSG_TYPE_ONLINE_LIST請(qǐng)求。4.3 歷史記錄查詢(xún)與本地文件緩存客戶(hù)端發(fā)送查詢(xún)請(qǐng)求時(shí)直接把MSG_TYPE_HISTORY類(lèi)型的空消息發(fā)給服務(wù)器服務(wù)器就返回整個(gè)聊天日志。這里要處理網(wǎng)絡(luò)傳輸長(zhǎng)度不穩(wěn)定的情況所以客戶(hù)端的接收邏輯不能只依賴(lài)一次recv。我用如下循環(huán)處理可能的多段響應(yīng)void request_history(int sock_fd) { chat_message_t req; memset(req, 0, sizeof(req)); req.header.type MSG_TYPE_HISTORY; send(sock_fd, req, sizeof(req.header), 0); char buf[MSG_MAX_LEN]; int total 0; int n; while ((n recv(sock_fd, buf total, sizeof(buf) - total - 1, 0)) 0) { total n; if (total sizeof(buf) - 1 || n MSG_MAX_LEN) break; } buf[total] \0; printf(%s\n, buf); return; }這個(gè)循環(huán)要想穩(wěn)定工作前提是服務(wù)器一次性發(fā)送完整數(shù)據(jù)后關(guān)閉連接或發(fā)送特定的結(jié)束標(biāo)記。當(dāng)前源碼里服務(wù)器用一次send發(fā)送歷史文件內(nèi)容然后保持連接不變這樣客戶(hù)端會(huì)阻塞在下一個(gè)recv等待新消息。所以更好的做法是服務(wù)器將歷史響應(yīng)用一個(gè)獨(dú)有的body長(zhǎng)度標(biāo)記客戶(hù)端通過(guò)body_len判斷是否收完整。我在自己改進(jìn)版里是讓服務(wù)器把文件內(nèi)容分多次發(fā)送并在末尾發(fā)送一個(gè)“END”字符串客戶(hù)端循環(huán)接收直到遇到END這樣更通用??蛻?hù)端也可以把收到的歷史記錄追加寫(xiě)入本地history_YYYYMMDD.log方便離線查看。寫(xiě)入時(shí)的打開(kāi)方式用O_APPEND保證多寫(xiě)不覆蓋。這個(gè)功能雖然不是必須但面試聊到“如何做持久化”時(shí)可以多一個(gè)加分項(xiàng)。5. 進(jìn)階優(yōu)化與排錯(cuò)讓聊天室從能跑到好跑5.1 用netstat和telnet直接驗(yàn)證服務(wù)器狀態(tài)源碼編譯后先用最基本的方式驗(yàn)證網(wǎng)絡(luò)棧是否正常。服務(wù)器運(yùn)行./server后用netstat -tlnp查看監(jiān)聽(tīng)端口應(yīng)能看到LISTEN狀態(tài)的IPv4 socket。然后使用telnet作為簡(jiǎn)易模擬客戶(hù)端手動(dòng)敲入二進(jìn)制消息較麻煩但可以用printf管道配合nc工具。比如nc -v 127.0.0.1 8888如果項(xiàng)目源碼監(jiān)聽(tīng)的端口不是8888需要去main.c里確認(rèn)#define PORT的設(shè)置。nc連接上后輸入任意文本如果服務(wù)器有回顯或廣播其他端口說(shuō)明鏈路通。實(shí)際排查中我發(fā)現(xiàn)最常見(jiàn)的錯(cuò)誤是socket bind失敗原因是端口被占用或沒(méi)有設(shè)置SO_REUSEADDR。在bind前加一行int opt 1; setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));這樣可以快速重啟服務(wù)器而不需要等TIME_WAIT超時(shí)。5.2 粘包與半包問(wèn)題定位方法局域網(wǎng)高并發(fā)下多條小消息可能連續(xù)到達(dá)觸發(fā)TCP的Nagle算法合并成一個(gè)大包接收方一次recv拿到多條消息這就是粘包。本項(xiàng)目使用固定頭部加變長(zhǎng)體的做法能區(qū)分每一條消息的邊界。但前提是recv必須完整地讀到頭和體。我在調(diào)試中曾遇到客戶(hù)端發(fā)兩次send第一次發(fā)header第二次發(fā)bodybody較小時(shí)兩次可能落入同一個(gè)TCP段接收方先讀12字節(jié)頭部沒(méi)問(wèn)題然后要根據(jù)header里的body_len繼續(xù)讀。但我在第三個(gè)recv階段只調(diào)用一次如果body沒(méi)到齊就返回0會(huì)直接break導(dǎo)致消息丟失。所以需要把讀取操作封裝成readnssize_t readn(int fd, void *buf, size_t count) { size_t left count; char *ptr (char *)buf; while (left 0) { ssize_t ret recv(fd, ptr, left, 0); if (ret 0) return ret; ptr ret; left - ret; } return count; }然后用readn替換所有直接recv。這樣處理半包問(wèn)題后粘包問(wèn)題其實(shí)也迎刃而解因?yàn)槊看味紘?yán)格按照頭部聲明的長(zhǎng)度讀取剩下的數(shù)據(jù)會(huì)留到下次recv再解析。5.3 線程安全的日志寫(xiě)入與退出清理歷史記錄寫(xiě)入chat.log時(shí)如果廣播線程A和線程B同時(shí)調(diào)用append_history可能發(fā)生交錯(cuò)寫(xiě)入行內(nèi)容穿插。在append_history內(nèi)部加一把全局日志鎖static pthread_mutex_t log_mutex PTHREAD_MUTEX_INITIALIZER; void append_history_safe(chat_message_t *msg) { pthread_mutex_lock(log_mutex); FILE *fp fopen(chat.log, a); if (fp) { fprintf(fp, [%ld] %s: %s\n, time(NULL), msg-from, msg-body); fclose(fp); } pthread_mutex_unlock(log_mutex); }服務(wù)器main函數(shù)收到SIGINT退出時(shí)一定要先遍歷鏈表并逐個(gè)close所有客戶(hù)端fd再釋放鏈表內(nèi)存最后關(guān)閉監(jiān)聽(tīng)fd。否則客戶(hù)端socket不會(huì)被內(nèi)核立即回收重啟服務(wù)器時(shí)可能報(bào)Address already in use??梢杂胹ignal(SIGINT, handler)注冊(cè)清理函數(shù)handler里將全局運(yùn)行標(biāo)志置為0主循環(huán)退出后執(zhí)行清理。5.4 用strace快速定位臨時(shí)故障如果客戶(hù)端發(fā)送消息后服務(wù)器端沒(méi)有轉(zhuǎn)發(fā)一個(gè)高效排查手段是strace跟蹤進(jìn)程的系統(tǒng)調(diào)用。假設(shè)服務(wù)器pid是1234strace -p 1234 -e tracenetwork,write,read -o /tmp/server_trace.log然后讓另一臺(tái)客戶(hù)端發(fā)一條消息查看trace日志里recv返回的字節(jié)數(shù)、send調(diào)用的目標(biāo)fd和返回值。如果send返回-1且errno為EPIPE說(shuō)明對(duì)端已關(guān)閉連接如果recv返回0說(shuō)明客戶(hù)端主動(dòng)斷開(kāi)了。這樣能快速判斷問(wèn)題在網(wǎng)絡(luò)層還是業(yè)務(wù)邏輯。這個(gè)技巧比打印log更快尤其適合排查只在特定網(wǎng)絡(luò)場(chǎng)景下才出現(xiàn)的偶發(fā)問(wèn)題。5.5 擴(kuò)展方向select/poll多路復(fù)用與private消息當(dāng)前項(xiàng)目是線程阻塞模型客戶(hù)端數(shù)量增加后在大量線程切換上會(huì)有開(kāi)銷(xiāo)。作為進(jìn)階練習(xí)可以用select或poll重寫(xiě)服務(wù)器事件循環(huán)將listenfd和所有客戶(hù)端fd放入fd_set統(tǒng)一處理可讀事件。這樣單線程就能支撐上百連接。另外協(xié)議里預(yù)留了MSG_TYPE_PRIVATE實(shí)現(xiàn)私聊很簡(jiǎn)單消息體里包含“目標(biāo)名字:內(nèi)容”服務(wù)器解析后轉(zhuǎn)發(fā)給對(duì)應(yīng)fd即可。這些改動(dòng)都在可控范圍內(nèi)建議把源碼復(fù)制一份出來(lái)先備份再逐項(xiàng)重構(gòu)每次都能跑通再繼續(xù)下一步。最后有個(gè)實(shí)用小技巧把makefile里的CFLAGS改為-Wall -Wextra -g編譯時(shí)把警告全部暴露出來(lái)。我看到源碼Makefile里只有一行g(shù)cc -o這在實(shí)際工作中不夠用。加上-fno-stack-protector調(diào)試棧問(wèn)題時(shí)關(guān)閉保護(hù)但上線前務(wù)必恢復(fù)。多讀幾遍clientlist.c里鏈表插入刪除的邏輯把它畫(huà)成圖理解指針操作后再去改比我在這里寫(xiě)一千字都有效。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色婷婷成人丁香| 久99久在线| 成人视频在线免费播放| 日韩av变天就操逼不卡区| 开心五月婷| 丁香五月网| 超碰av在线| 丁香五月婷婷激情蜜桃| 丁香婷婷六月天| 超碰免费电影| www.久99| AA片在线观看视频在线播放| 婷婷五月激情综合| 综合激情在线| 99啪99| 一本道综合网| 婷婷基地成人五月天| 色哟哟性爱av| 久久人操-久草婷婷-成人AV| 久久538| 欧美成人热| 五月天激情四射网站| 一本色道久久88加勒比| 日产精品久久久久久久蜜臀| 99∨VTV| 五月天激情国产综合婷婷| 婷婷香香五月| 天天弄天天爽| 五月香蕉综合| 色五月丁香激情| 激情丁香社区| www,五月天com| 99ri国产精品| 激情久久 婷婷| 九九99偷拍视频| 五月开心播播网| 五月激情天| 免费啪啪亚州视频| 五月丁香在线观看| 超碰在线91| 婷婷五月天成人| 97在线刺激| 丁香亭亭激情四射| 久久婷婷五月综合一| 少妇人妻丰满做爰XXX| 欧美性爱五月天| 五月天操逼网| 九九这里有精品| 91久久久久久久久| 亚洲激情AV| 来吧亚洲综合网| 婷婷婷婷婷婷婷五月丁香| 1区2区视频| 色五婷婷开心缴| 婷婷五月天亚洲丁香| 五月丁香亚洲综合网| 久久久久亚洲A∨成人乱码电影| 五月丁香999| 99碰碰视频| 性生活视频98791| 97操视频| 五月丁花色综合网| 日本丁香五月| 99久久综合网| 无码人妻丰满熟妇奶水区码| 久久久九九九 99| 久久日曰| av在线资源| www.久久久久| 欧美va亚洲va在线播放| 欧美精产国品一二三区| 婷婷五月激情小说| 羞羞嫩草视频| 伊九九三级区| 狠狠狠五月婷婷六月丁香| 亚洲综合婷婷五月天| 五月婷婷六月基地| 午夜丁香婷婷| 色婷婷女优有码五月亭| 青青夜夜狠狠夜夜狠狠| 天天干夜夜谢| 婷婷久久大香蕉| 影音先锋自拍网| 五月天堂六月丁香亚州中文字幕久久| 99操视频| 中文字幕AV在线播放| 超碰人妻在线| 色五月婷婷在线观看| 天天操夜夜操| 久久五月婷天天干| 久久伊人婷婷| 五月丁香婷婷AV| 婷婷久热| 婷婷综合一二三| 色色五月丁香| 人人草人人舔| 99久久人人| 狠狠人妻色综合| 亚洲五月婷婷在线| 99黄色性生活| 干一干xxxx| 九九热a| 亚洲色色色色| 日韩精品无码99| 超碰com| 天天色情站| 丁香五月www| 丁香九月综合| 婷婷五月花| 大地资源色婷婷视频在线| 五月婷九九草| 色丁香影院| 久草五月天| 五月天婷婷青青草| 亚洲十月婷婷综合| 中国女人做爰A片| 99色.com| 天天爱天天做天天操| 婷婷久久综合| 亚洲区,视频区,视频区免费| 九九色大香蕉| 综合五月丁香97| 天天更新天天亚洲| 99无码| 色婷婷丁香综合中文字幕| 人妻操操色| 久久这里都是精品| 少妇高潮呻吟A片免费看软件 | 久久66成人网站| 夜夜撸天天操| 亚洲综合99| se影音资源在线观看| 97操碰| 五月丁香操婷逼| 99久久玖玖| 夜精品无码A片一区二区蜜桃| 五月丁香成人| 九九性视频| 国产精品岛国片在线观看免费| 五月丁香亭亭成人电影| 欧美日韩二区在线| A网在线欧洲| 日本欧美成人片AAAA| av中文在线| 久久久久久久人妻| 国产成人在线不卡AV| 综合激情视频| 色婷婷导航| 综合色影| 色色色99韩| www久久久| 66精品国产成人| 激情四射五月天| 91一起操| 国产精品a无线| 五月丁香日本片| 久久人操| 26uuuavcom| 亚洲日韩一页精品发布| 国产片色| 五月丁香婷婷婷激情爱爱| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 久草婷婷| 五月天四色房丁香| 日韩天堂久久| 九热...av| 玖玖激情五月天| 人妻激情综合| 五月婷婷在线网站| 色噜久| 五月天亚洲综合网| 99小视频| 大香蕉久久伊人网| 婷婷四色五月| 丁香五月天婷婷久久| seuuu婷婷| 99热这里只有精品66| 成人资源在线| 久久99热这里只频精品6学生| 热热久久精品视频| 任你搞在线观看视频| 99视频久久| 人人操操| 婷婷五月五月丁香| 91viP在线看| 五月天啪啪| 风流少妇A片一区二区蜜桃| 97深爱伊人综合| 精品国产a| 丁香婷婷色色| 婷婷丁香五月六月激情| 一级精品999WWW| 欧美婷婷六月丁香综合色| 九九婷婷网五月天| 日日色综合| 久久作爱| 激情婷婷黄色五月| 一起草av| 热久久91| 2025色婷婷| 91久久| 亚洲成人另类| 操逼123网| 伦99热| 另类图片五月天| 超碰精品手机在线| 亚洲欧洲99| 婷婷五月丁香国产| 国产精品人人做人人爽人人添| 五月丁香婷婷三级| 91热er| 欧美三级视频下载| 五月四色激情| 国产乱人偷精品人妻A片| 天天操天天操天天操天天操天天操天天操| 久久五月视频| 日本 欧美在线| 综合久久激情久久| 三人荫蒂添的好舒服A片| www.开心激情| 色婷婷香蕉丁丁网| 色99亚洲| 99久久99视频只有精品| 五月婷婷亚洲色图| 色五月美女| 九九热精品视频在线观看| 五月丁香综合| 五月天社区狠狠| 99婷婷五月天| 丁香五月电影| 97超碰综合| 九色1区视频在线| 婷婷伊人| 激情小说五月天| 天天综合 99久久婷婷| 9999色色色色| anquye五月| 狠狠五月激情在线| 丁香六月婷婷久久综合八月| 亚洲另类在线观看| 人人爱操| 99色这里| 五月天激情在线视频| 色综合婷婷| 色婷婷激情五月天| 一起草无码| 中文字幕av久久爽| 久久天堂加勒比| 色五月综合网站| 激情综合网激情五月天| 免费无码毛片一区二区A片 | 激情五月婷婷综合| 丁香婷婷久久| 五月天激情小说网| 人妻激情久久| 五月天婷婷激情四射综合| 七月丁香婷婷 色色| 中字幕视频在线永久在线观看免费| 中文字幕在线资源| 99热精品在线| 91狼友视频在线观看| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 男人大jjc女人免费视频| 狠狠五月天| 人人爱人人草| 国产五月视频| 亚洲免费视频网站| 色爱综合网| 亚洲色在线观看| 97在线刺激| AV在线大香蕉| 亚洲最大成人综合网720P| 99久久综合网| 操逼视频网址| 99久久99久久| 99丁香五月婷| ji'qi'luan'ren'lun| 丁香五月婷婷在线观看| 成人网址在线观看| 综合色、色综合| 97伦乱| 亚洲AV电影av| 青青.com| 99视频网| 99色性爰网络| 丁香五月婷婷五月基地| 五月婷婷激情网| 无码一区二区日韩| 五月婷视屏在线观看| 色色亚洲视频| 亚洲乱码日产精品BD| 色婷婷狠狠禁18久久| 偷偷操九九| 色五月色五天色情网| 色婷婷性爱网| 妇激情基地| 色情播放| 亚洲五月花| 国产69久久久欧美黑人A片| 亚洲精品久久久无码| 开心五月婷婷伊人| 久久色五月| 五月丁香花婷婷玉莉AV| 99这里只有精品|v| 91热在线观看视频| 国产婷婷五月中文字幕高清| 久久五月天网| 九九综合九色欧美狠狠| 丁香婷婷五月天色综合| 欧美日本另类| 激情综合网激情五月婷婷| 99热在线看片| 思思热久久婷婷五月天| 久久婷婷五月天| 午夜av网| 国产美女精品| 天天爽夜夜操| 97人妻碰碰碰久| 六月丁香五月激情婷婷| 九九热这里只有国产精品| 中文字幕成人影视| 色九月综合| 激情影院内射| 五月丁香激情啪啪| www.婷婷.com| 色色色热| 丁香五月婷婷激情蜜桃| 艾小青av| 丰满少妇猛烈A片免费看观看| 丁香五月婷婷欧美激情-中文天堂最新版在线观看 | www夜夜操comwww| 日日杆天天| 丁香天堂夜| 天天粽合合合合| 九九色欲网| 99国产97在线,| 丁香五月婷婷啪| 日本WWW九九九| 伊人狼人干| 狠狠va| 久久性爱视频网站| 六月激情久久婷婷| 色99在线| 五月激情视频网| 色色色色热| 久久性刺激| 久久成人人妻| 久久久免费图片视频| 丁香婷婷九月在线| www·五月天| 五月天婷婷影院| 黄色三级日本| 爱射综合| 亚洲激情丁香五月天色| 久久ww| 色婷婷99| 精品亚洲国产成AV人片传媒| 五月婷婷co.m| 伊人爱爱日本| 深爱五月婷| 激情五月婷婷丁香综合网| 激情五月丁香激情综合网 | 婷婷大香蕉| 99热这里都是精品| 久久婷五月| 91中文在线| 五月天激情黄色小说在线观看| www.91.com黄| 久久欧洲久久| 丁香情色五月| 色色色色热| 久草五月天| 九九性爱网| 综合激情五月婷婷| 激情五月天 婷婷| 婷婷放心五日爱| 丁香五月婷婷在线| 五月丁香婷婷中文网| 操逼亚洲天堂| 久操激情| 丁香五月色综合色播五月| 成人免费120分钟啪啪| 五月丁婷婷| 操逼视频网址| 丁香五月性| 99这里有精品久久97| 激情丁香五月| 婷婷五月天色播| 久久人人超| 九九热精品视频| 五月激情精品视频| 色娸娸综合网| 国产精品涩涩涩视频网站| 天天操夜夜爽歪歪| 久久xxxx| 欧美日本不卡黄色片| 思思精品视频| 五月丁香综合激情在线观看| 日韩av高清| 中文字幕综合| 丁香婷婷色五月天| 九九综合| 极品五月天| 99无码超碰| 激情伊人五月婷婷久久| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 婷婷在线视频| 99精品一二三四视频| 日日日日做夜夜夜夜无码| 久草x色在线观看99 | 激情综合五月天| 色五月激情五月丁香五月婷婷啪啪综合 | 99国产精品久久久久久久久久久 | 天天碰天天插天天操| 91综合在线视频| 操91| 香蕉操亚洲| 婷婷五月色影视先锋| 综合婷| 色狠狠色| 日韩黄黄| 狠狠干五月天| 色丁香影院| 婷婷色激情网| 成人五月天丁香婷| 久久机热探花| 玖玖九九超碰| 欧美性生交XXXXX无码小说| 夜夜骑天天操| 欧美成人五月天| 欧美成性色| 色婷婷人人| 97精品人人A片免费看| 亚洲综合视频网| 国产,欧美,日韩,性爱| 秋霞黄色一级久久| 色婷| 婷婷五月丁香花综合| 色哟呦av| 男妓跪趴把舌头伸进我的嘴巴| 中文字幕丰满人妻无码专区| 天天透天天爱| 激情欧美丁香五月| 99re这里只有精品视频了| 性爱动图国产麻豆一区二区三区| 亚洲中文字幕av| 激情婷婷99| 五月天开心色色网| 五月天婷婷综合色| 久草丁香婷婷1024| 亚洲狠狠色丁香婷婷综合久久| 9久热| 久9视频| 激情五月综合网| 99色日本| 激情婷婷五月| 中文无码婷婷| 婷婷大香蕉| 色综合久久综合中文综合网| 中文字幕九九九九| 久操大| 熟女激情网| 婷婷在线综合| 97在线视频观看| 激情五月天丁香| 日本久久精品| 国产亚洲精品人人| 亚洲十月婷婷综合| 久久婷婷五月综合伊人| 五月婷婷官网色| 久久久免费精彩视频| 久久婷婷五月天蜜桃| 五月激情五月婷婷五月天在线| 色婷婷a三区麻| 久久AV电影| 天天五月情| 这里只有精品免费观看网占| 色情婷婷五月天| 亚洲无码色| 色欲婷婷五月天丁香| 婷婷五月天AV在线| 五月天婷婷综合网| 伊人在线另类| 欧美图片丁香五月天| 久草性爱| 操笔无码| 在线1青婷| 亭亭玉月丁香| 激情六月婷婷| 99热99日天天干| 在线99精品| 91超级碰在线视频| 99热在线99| 婷婷五月天亚洲精品| 婷婷激情社区| 99热97| 99热国品| 影视av久久久噜噜噜噜噜三级| 国产精品大香蕉| 婷婷五月丁香高清无码| 日韩AAAAA| 99精品在这里| 丁香亚洲色综合| 婷婷五月电影| 开心五月丁香啪| 99re6久热只有精品6在线直播| 超碰9| www.色五月| 亚洲区在线| 激情五月婷| 五月丁香六月婷婷在线小说视频| 丁香五月影院| 少妇出轨做爰高潮A片| 五月天激情图片网| 天天人人天天爽| www.婷婷五月| 成人综合网站| 伊久久婷婷| 天天摸日日舔狠狠添婷婷婷| 91操片| 屁股翘好撅高迎合跪趴| 天天综合 99久久婷婷| 另类色视频| 色五月激情五月| 少妇性按摩无码中文A片| 激情久久网 | 五月婷婷六月丁香玖玖玫瑰91| 丁香五月激情婷婷视频| a久久| 日本黄色一级| 国产乱码久久| 久久99精品久久久久久三级| 91人久| 99久久网站| 色色色图| 九九爱激情| 五月丁香六月色婷婷综合五月天| 91婷婷色| 九月激情综合婷婷| 俺去也五月天婷婷| 99re欧美精品| 午夜青草资源| 图片区 小说区 区 亚洲五月| 五月天婷婷情色| 亚洲激情免费视频| 婷婷无五月无码视频| 久久精品性爱视频,| 亚洲色另类| 97大香蕉五月天| 中文激情网| 爱之国产色情综合| 婷婷成人AV| 韩国97天堂| WWW.夜夜| 国产精品成人网址| 丁香六月天之亚州热女| 丁香五月天大香蕉啪啪| 丁香五月婷婷激情123| 五月婷婷六月丁香在线| 噜噜色天天开心| 色播五月婷婷综合| 久久久97| 天天色五月| 欧洲色色| se99在线| 超碰97在线观看免费| 我爱婷婷五月天综合88| 国产成人综合电影| 色噜噜婷婷| 丁香六月婷婷激情| 丁香狠狠色婷婷久久无码视频| 婷婷五月天国产传媒| 五月丁香六月欧美综合| 欧美怡红院黄站| 五月丁香网中文字幕| 中文字幕按摩做爰| 丁香五月天成人| 九一娱乐在线观看视频| 欧美丁香婷婷五月| 成人电影AV在线观看| 91无码视频| 六月婷婷激情| 国产精品国产成人国产三级 | 99热99思午夜精品| 999热这里只有美国精品| site:feetmall.com| 五月天丁香婷婷久久九| 成人丁香婷婷| 成人五月丁香社区| 精品夜夜澡人妻无码AV| 天天操狠狠操| 开心婷婷五月| 婷婷成人小说综合| 亚洲免费视频网站| 色墦五月丁香| 婷婷五月天熟妇| 去色色五月天| 国产无套精品一区二区| 六月婷婷七月丁香| 先锋资源婷婷| 欧美日韩999| 99视频一区| 色婷婷激情| www激情| 少妇人妻综合色6699| 九九热99熟女| 亚洲无AV在线中文字幕| 天天干天天干天天干| 婷婷色在线观看| 欧美成人AAA片一区国产精品| 九九婷婷五月天| 爆乳熟妇一区二区三区爆乳照片| 99视频这里有精品| 欧美色色色色色色色色色色| 亚洲激情无码久久| 日本色久| 丁香五月色情av| 丁香五月婷婷基地| av中文网站| 午夜丁香丁香婷婷| 久久婷婷综合色丁香| 色噜噜狠狠一区二区三区| 99热99热| A一级操| 婷婷五月天网址| 亚洲日本韩国| 久久久网站| 丁香五月天在线| 激情丁香婷婷六月天| 五月婷视频在线观看| 丁香五月 六月婷婷首页| 另类 在线| 色哟呦av| 九九亚洲| 9久国产精品| 色色哒五月婷婷六月丁香| 精a品a视a频| 99啪啪网| 人人操91色| 蜜桃成语时李时珍 免费| 久久3p| 亚洲色情网站| 激情都市五月天| 色5在线| 国产日韩av片| 永久天堂日本| 大香蕉在线99热| 五月丁香影视| 成人在线99| 激情五月综合网最新| 激情五月开心五月丁香五月| 99爱免费视频在线观看| 亚洲综合网激情五月天| 激情五月天婷婷免费观看| 婷婷五月天AV在线| 99久热精品在线| tingtingseav| 丁香五月天AV在线 | 亚洲 五月 婷婷 成人| 天天色情站| wwwss在线观看| 欧美日本黄色| 欧美WW在线网| 人操91在线| 久久久久九九九九视屏小说88| 欧美成人精品A片免费一区99| 九九黄色网| 大香蕉中文| 97九色视频| 青草五月天| 区区欧美你爱| 99热这里只| 战争与艾拉电影免费观看| 美女激情婷婷| 亚洲小说欧美激情| 精品色色色| 色婷婷a三区麻| 综合五月天婷婷色| 激情综合五月色丁香婷婷| 亚洲一个色| 婷婷激情综合| 97av在线视频| xxxx五月| 99 这里只有精品| www.com操| 精品福利911| 狠狠草综合网| 26UUU欧美| 99∨VTV| 色婷婷69| 五月天伊人久久| 欧美性爱中文字幕| 色综合九九色综合88| 91丨九色丨国产打屁股| 五月开心婷婷极品激情| 五月天激情Av| 久热这里只有精品视频免费观看| 久久人妻精品| 成片免费观看视频大全| 九色视频91| 极品人妻VIDEOSSS人妻| 天天综合网~91| 国产黄色一级片| 九热免费视频| 激情校园 亚洲| 婷婷五月天电影在线| 五月丁香六月婷婷姐| 99啪啪网| 亚洲乱码日产精品BD| 色婷婷丁香花五月天| www.99久久久久99| 99精品热| 天天综合亚洲| 色噜噜狠狠色综合日日| 99无码黄色视频| 色五月综合激情网| 五月丁香婷婷啪啪综合| 99视频久久免费视频| 婷婷亚洲在线| 狠狠色狠狠操| 91丨九色丨首页| 婷婷五月天黄色| 五月久久噜噜| 综合一区二区三区| 精品夜夜澡人妻无码AV| 国产超碰人人| 九九精品这里只有| 超碰免费99| 乱岳熟女50岁| www.色综合| 性爱电影科技贸易有限公司| 天天日天天干天天爽| 欧美激情综合| 丁香五月玖玖| 99色啊| 五月天婷婷综合免费| 国产人妻人伦精品一区二区| 日韩久综合| 色香五月天| 伊人婷婷大香蕉| av首页在线| wWwCom夜操wwW| 99热国产免费| 久久精品国产精品| 另类天堂| 五月激情婷婷在线| 九九99精品视品| 丁香九月激情| 丁香五月在线自慰| 人妻免费网站| 玖玖精品资源| 婷婷91| 99ri精品视频在线观看| 五月婷婷基地| 丁香五月婷婷欧美性爱| 欧美激情五月综合| 婷婷啪啪| 97婷婷在线| 五月色婷婷综合| 国外亚洲成AV人片在线观看| www.xtbsty.cn.com蜜乳AV| 999热这里只有精品| 黄色AAAA韩国guochansanji| 2025中文在线视频字幕免费观看| www.日日夜夜.com| 激情六月天婷婷| 六月婷婷五月天| 91热视频| 天天做 天天爱| 99国产精品久久久久久久久久久 | 天天综合亚洲综合网天天αⅴ| www.91婷婷| 91丨人妻丨国产丨丝袜| 五月婷婷激情综合网| 夜夜嗨一区二区三区直播内容| 亚洲激情淫网| 啪啪一区| 五月色婷婷综合丁香精品无遮挡| 狠狠搞狠狠操| xxxx五月| 婷婷五月天伊人| 三区激情四射av| 热久精品| 色婷婷六月综合| 五月婷婷激情网| 久久午夜理论| 四川BBB搡BBB搡多人乱亂| 激情网站综合五月天| 国内外色色色色色成人视频| 国产欧美日韩一区二区三区| 嫩BBB槡BBBB搡BBBB| 激情综合网,婷婷五月天| 天天干,夜夜爽| 天天艹天天色| 五月婷婷碰碰| 久热只有精品| 99热99美国在线观看| 日本综合色色| 久久九九综合| 98国产精品综合一区二区三区 | 丁香五月电影| 色五月天丁香婷婷| 大香蕉av在线| 色 五月俺去也| 日日操夜夜操不卡| 国产激情在线| 欧洲不卡视频| 中字幕视频在线永久在线观看免费 | 日本片日本片祼观看网站在线看中文版网页在线看 | 婷婷中文字幕| 日韩欧美四五区| 激情五月婷婷视频| 婷婷成人五月天成人文学| 大香蕉久热| 五月天丁香| 丁香五月,激情五月,深爱五月| 久操人| 99综合在线| 中文字幕丁香五月| 9久热在线视频| 日本久热| 五月丁香婷中文| 国产AV一区二区三区最新精品| www激情com| 欧美日本黄色| www.91av.com| 激情网五月天| 超碰AAAAAAV| 色婷婷女优有码五月亭| 99久久这里只有精品| 色色婷婷综合网| 99碰碰视频| 午夜69成人做爰视频| 九九综合| 管管補管管紱| 国产操B视频| 大学生高潮无套内谢视频| 久久99热这里只有精品| 九九久久精品| 成人在线高清| 五月天婷婷小说| 97超碰在线免费观看| 人妻内射麻豆视频| 国产成人高清| 亚洲欧洲另类图片| 超碰人人超碰| 丁香五月婷婷88在线| 99热这里只有精品1025| 亚洲亚洲人成综合网络| 男人的天堂五月丁香| 精品人妻久久久久久久| 久久作爱| 99人人精品| 97精品人人A片免费看| 99ri国产| 日韩AV大全| 五月丁香综合精品| 51XX午夜影福利| 亚洲久艹| 嫩草极品| 久久99久久99精品免视看婷婷| 婷婷五月天无码| 婷婷色情小说| 亚洲性受XXXX五月丁香| 色99日韩| 大香蕉中文| 亚洲AV电影av| 天天激情站| 99久久久久| 97在线视频观看| 综合在线色婷婷| 五月草影视| 亚色网站小视频| 色播五月丁香| 亚洲av成人在线| 大香蕉中文| 日本操B视频在线观看| 成人丁香五月| 色五月综合| 日韩在线一级| 久久9热| 亚美欧色影院| 热思思| 亚洲精品五月| dingxiangtingtingliuyue| 婷婷六月丁香开心深深爱| 五月丁香色色网| 九九视屏| 99久久精彩视频| 色一情一乱一乱91Av| www.九月婷婷丁香.com| 久草五月丁香婷婷综合| 亚洲狠狠爱婷婷| 9色资源在线| 日本人人超碰| 涩丁香91| 丁香五月色情av| 超级久久久| 激情久久网| 激情五月天婷婷色色色色色色色色色色色 | 五月天婷婷久久视频| 97资源欧美日韩大香蕉超碰一区| 久热 91| 日本99视频| 丁香婷婷网| 天天做天天爱天天爽| 91碰碰| 五月天婷婷综合| 精品无码久久久久久久久| 国产毛片精品一区二区色欲黄A片| 五月天激情四射| 日韩AV无码影片| 五月综合激情图片 | 色色丁香| 精品国产va久久久久| 狠色狠色狠色狠色狠色网| 丁香激惜男女| 99热99免费| 这里只有精品免费视频| 丁香五月婷婷在线| 亚洲精品大片| 婷婷综合激情| 亚洲综合色激情色五月| 九九色天堂| 五月天综合在线| 日韩六六久久电影| 欧美爆乳一区二区三区| 毛片新网地| 亚州操人在线视频| 免费看欧美成人A片无码| 色香蕉精品五夜婷| 天天综合91入口| 六月色婷婷色| 5月婷婷激情6月| 成人在线99| 色欲丁香| 日日操夜夜擼| 色色色色色色色色色色色色色五月天 | 99性爱视频| 噜噜在线| 大香蕉狠狠爱主页| 99热超碰| 色综合激情| 丁香九月婷婷综合| 丁香婷婷天堂| 五月丁香色婷基地综合久久| 婷婷亚洲五| 色五月婷婷五月| 日韩成人精品中文字幕| 俺来也狠狠| 91精品无码久久久久久五月天| 99热久只有| 五月天婷婷成人| 天天天天干| 99视频91| 天天做天天爱天天爽在| 亚洲色图五月丁香| 久久99综合| 99视频在线观看网址| 我要色综合五月婷婷| 66成人网| 懂色av粉嫩AV蜜臀AV| 超碰成人在线观看| 婷婷色激情五月天| 婷婷五月天伊人| 色五月婷婷激情基地| 狠狠干在线视频| 综合激情在线视频| 五月停亭久久电影| 夜夜操夜夜爽| a在线观看| 99热亚洲综合| 九九热在视频| 丁香五月激情婷婷| 奇米四色五月天| 米奇影视资源777狠狠色婷婷五月天激情网| 91在线日| 久热婷婷在线视频| 九九热这里只有精品31| 婷婷综合五月天| 欧美日韩成人免费在线| 五月色情婷婷| 99热青青草| 五月色亚洲| 人妻精品久久久久久| 国产乱妇无乱码大黄AA片| 超碰电影在线播放| 五月六月丁香激情| 真实的国产乱XXXX在线91| 99色色爰| 色婷久久| 六月丁香婷婷综合影院| 色综合综合网| 色婷婷激情Av久久久| 婷婷激情五月吧| 亚洲综合五月天婷婷| 五月久久网| 色99在线| 伊人九九综合| 影音先锋777xfplay色资源网站| 色九四色| 26uuuavcom| 国产精产国品一二三在观看| 五月天婷婷午夜丁香| 91九色视频| 9久精品视频| 国产精品色婷婷久久久精品| 性爱激情小说AV五月丁香花| 久久丁香五月天| 久操大屁股女人av| 99精在线| 中文字幕久久婷九女同| www.henhengan| 综合超碰熟| 久久婷狠狠色| 狠狠香蕉| 色天天综合天天综合频道。| 狠狠操综合| 婷婷五月激情四月综合| 少妇高潮一区二区三区99欧美| 综合激情在线| 99视频精品| 91vip在线观看| 五月天激情电影| 九九精品热| 色情五月婷婷| 五月婷深深爱激情网| 四川女人毛多水多A片| 色婷五月| 天天色综| 精品99在线| 日韩免费乱轮网站| 99久久网站| 五月天婷婷丁香视频| 综合久久综合五月天婷婷| 久久亚洲激情五码| 久久精品91视频| 色色色色色综合| 无码一区二区日韩| 69热91天堂| 丁香桃色网| 97av在线视频| 99年操人人爽| 久久人妻在线| 婷婷少妇激情| 嫩草AV久久伊人妇女超级A| 亚洲激情电影五月天色婷婷丁香一起草| 99人妻碰碰久久久禁片| 夜夜躁狠狠 | 99色激| 日韩AV中文在线观看| 五月婷婷福利| www.91九色| 丰满女老板BD高清A片| 狠狠五月天婷婷激情网。| 大香蕉五月| 色婷婷狠| 侠女刀之记忆电影在线看免费| 97超级碰人人| 色爱综合网| 欧美丁香六月在线观看视频| 肏日网在线看| 午夜免费试看| 天天色综合综合| 欧美97色| 日韩综合成人| 久久9视频欧美| 五月丁六月香av| 中文字幕婷婷在线| 亚洲精品99| 丁香五月天五码婷婷| 狼人狠狠操| 色婷婷色综合久久精品V| 激情丁香五月婷婷| 婷婷五月天视频小说| 91九色熟女| 影音先锋91网站在线观看| 五月丁香六月成人| 五月天色婷婷基地| 亚洲在线操| 九月婷婷综合在线| 国产精品电影| 国产精品久久久海的味道| 99小精品| 日本啪啪天堂| 大香蕉视频99| 色99色| 黄色成人网站在线播放| 亚洲XX日本| 69热在线| 激情视频91| 丁香五月影院| 99热碰碰| www.成人婷婷综合| 色五月 激情婷婷 综合五月天| 四季AV综合网| 无码成人AAAAA毛片AI换脸| 97福利视频| 婷婷的色色五月天| 99久久精品网| 99热国产国产| 激情图片亚洲| 天天综合久久| 综合网网欲色| Www.se.久久| 亚洲乱码精品久久久久..| 婷婷伊人綜合中文字幕| 女人被男人吃奶到高潮| 这里只有精品在线播放| 蜜臀A∨在线水帘洞| 婷婷九月丁香| 丁香五月婷婷天堂大香蕉| 九九色精品| 五月丁香六月婷婷激情网| 丁香色情五月综合网站| 色。 日日日| 色色成人網| 99热精品在线播放| 亚洲不卡| 婷婷综合色图| 九色无码| 97色色婷婷五月天| 色色色在线观看| 日本三级色| 99视频在线啪| 伊人五月婷婷国产视频| 丁香五月婷婷影视先锋| 色婷青青| 潘金莲AAAAAAAAAA| 中文中文在线| 伊人久久大香线蕉精品| 51精品国自产在线| 亚洲妇女熟BBW| 欧洲MV日韩MV国产| 五月丁香婷婷成人网| 婷婷五月天激情小说| 国产乱人偷精品人妻A片| 秋霞免费视频| 午夜69成人做爰视频| 五月天婷婷香蕉狠狠超碰综合| 在线可以看的av网址| 五月天色婷婷伊人网| 丁香六月天堂| 天天肏天天爽夜夜爽| 九九热视频免费| 激情欧美五月丁香| 色色网站免费| 99免费在线视频| 激情久久久久久| www.久久久久久久| 五月天久久婷婷| 色婷婷成人做爰A片免费看网站| 国产日产亚洲系列最新| 亚洲精品又粗又大又爽A片 | 天堂久久丁香| 嘿嘿视频免费看9| 婷婷丁香www视频日本韩国| 操97免费超级视频| 天天色天天搡| henhencao国产在线| 五月婷婷丁香av| 五月的色婷婷高潮| 五月天婷婷丁香导航| 九九热99热| 日本一级黄色片。| 99欧美三级视频| 免费看无码视频A级| 97色碰| 激情丁香五月激情婷婷| 六月丁香婷婷六月激情综合| 无码操B| 色播五月网| 国产午夜成人免费看片无遮挡| 色五月婷婷丁香凹凸| 9久热在线视频精品| Www.se.久久| 五月丁香六月婷| 先锋av性爱成人电影| 五月丁香六月天| 26uuu亚洲| 一本到不卡高清DVD| 色综合久久88色综合天天看| 久操人妻| 中文字幕色色色| 91九色精品女同系列| 国产AV一区二区三区日韩| 五月天另类小说久久小说网| 五月丁香精品| 丁香六月激情蜜桃| 五月开心网| http:色情日本com| 超级碰碰91| 国产高清RV综合aVa| 天天色99| 超碰成人黄色网| 色婷婷综合久久久久| 五月色婷婷影视在线电影| 九九成人| 丁香久久在线| 婷婷九色| 欧美性丁香色色五月天综合爱爱| 天天综合精品| 五月丁香婷婷成人网| 激情宗合 激情宗合| 深爱五月亚洲| 这里只有精品在线观看视频| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 欧美交换配乱吟粗大25P| 97爱综合| 噜噜噜噜在线| 五月天国产| 大大香蕉综合在线| 九九免费精品在线视频| 人妻视频在线| 久久久一级AAA| 韩日在线熟女| 色色五月婷婷久久| 丁香五月婷婷老师网站| 色性综合| 91人操| 玖玖综合玖玖| 丁香五月1页| 国产精品成人AV在线| 操比激情五月| 九九久久99| 九九久久综合| 玖玖99免费视频| 强伦轩人妻一区二区电影| 色.五月综合网| 97亚洲色 torrent magnet| 婷婷久久丁香五月| 五月五月婷婷| 丁香六月伊人| 国产精品天天狠天天看| 无码色色色色色| 亚洲成人高清在线| 中文字幕日本最新乱码视频| 色婷婷综合久色AV五色最新| 色婷婷丁香| 九九99精品视频| 色五月激情| 丁香五月婷婷少妇| 丁香五月婷在线观看| 丁香六月婷婷色XXXX| 五月天色播网| 丁香六月婷婷综合| aaaaa不卡| 婷婷五月天激情小说| 香蕉操亚洲| 99热e| 91viP在线看| 亚洲激情网| 97香蕉久久超级碰碰高清版 | 97精品综合久久内射| 色大综合| 国产精品18久久久| 丁香五月色综合色播五月| 超碰在线91| 激情五月婷婷网| 国产99久久久国产精品免费看| 99色视频在线观看最新| 综合99综合久久久久久久| AⅤ在线播放网| 热久精品| 99色干| 四色永久成人网站|