亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

MFC TCP Socket實(shí)戰(zhàn):CAsyncSocket異步通信與粘包處理

MFC TCP Socket實(shí)戰(zhàn):CAsyncSocket異步通信與粘包處理 簡(jiǎn)介這份壓縮包面向Windows平臺(tái)網(wǎng)絡(luò)編程入門與進(jìn)階學(xué)習(xí)者圍繞基于Socket的TCP通信用MFC搭建客戶端/服務(wù)器C/S架構(gòu)示例幫助理解連接建立、數(shù)據(jù)收發(fā)與連接關(guān)閉的完整流程適合課程實(shí)驗(yàn)、自學(xué)練習(xí)和項(xiàng)目原型參考。包內(nèi)共4個(gè)文件以2個(gè)cpp源文件和2個(gè)h頭文件組成整體約6KB體量輕便便于直接對(duì)照閱讀與二次練習(xí)。已有1264人學(xué)習(xí)下載說明其在MFC網(wǎng)絡(luò)編程練習(xí)場(chǎng)景中具有一定參考價(jià)值。代碼圍繞CSocket對(duì)象的使用展開覆蓋Winsock初始化、服務(wù)器綁定監(jiān)聽與接受連接、客戶端連接服務(wù)器以及Send/Receive收發(fā)數(shù)據(jù)和Close釋放資源等關(guān)鍵環(huán)節(jié)能夠幫助讀者把抽象協(xié)議概念落到具體調(diào)用上。讀者可借此梳理MFC對(duì)Winsock的封裝方式理解客戶端與服務(wù)器對(duì)話框類的職責(zé)劃分并在此基礎(chǔ)上調(diào)試、擴(kuò)展自己的TCP通信程序。1. 從一次“連不上”的調(diào)試說起這套 MFC TCP 程序到底解決什么問題把 MFC、TCP、Socket 三個(gè)詞湊進(jìn)同一個(gè)工程真正卡人的往往不是 API 名字記不住而是 MFC 的消息循環(huán)、線程模型和窗口生命周期怎么跟網(wǎng)絡(luò)收發(fā)共存。這套 C/S 架構(gòu)程序把服務(wù)端監(jiān)聽、客戶端連接、消息收發(fā)、日志顯示拆成幾個(gè)職責(zé)清晰的類用 CAsyncSocket 的異步事件模型驅(qū)動(dòng)收發(fā)適合做局域網(wǎng)聊天、設(shè)備指令下發(fā)、上位機(jī)通信這類小體量工具的原型也適合剛接觸網(wǎng)絡(luò)編程、想看清一次連接從建立到斷開完整鏈路的開發(fā)者。它不追求高并發(fā)指標(biāo)追求的是結(jié)構(gòu)清楚、每一步都能打斷點(diǎn)看明白。2. 工程結(jié)構(gòu)與選型先定 CAsyncSocket 和 CSocket 的邊界動(dòng)手寫代碼之前工程怎么切分、用哪套 socket 封裝比后面寫多少行都關(guān)鍵。很多人一上來就把CAsyncSocket塞進(jìn)對(duì)話框類里結(jié)果一個(gè)OnReceive里既有界面刷新又有協(xié)議解析改到第三個(gè)功能就再也理不清了。2.1 一份可以直接編譯的雙工程目錄這個(gè)項(xiàng)目按“共享協(xié)議 服務(wù)端 客戶端”三塊切Common放兩端都要用的頭文件Server和Client各是一個(gè)獨(dú)立的 MFC 對(duì)話框工程編出來的兩個(gè) exe 可以分別跑在兩臺(tái)機(jī)器上也可以在同一臺(tái)機(jī)器上開兩個(gè)實(shí)例自測(cè)。MfcTcpCS/ ├── Common/ │ ├── Protocol.h // 包頭結(jié)構(gòu)、消息類型枚舉、字節(jié)序轉(zhuǎn)換 │ └── PacketBuffer.h // 收包緩沖區(qū)負(fù)責(zé)粘包/半包切分 ├── Server/ │ ├── ServerApp.h/.cpp // CWinApp 派生InitInstance 里調(diào) AfxSocketInit │ ├── ServerDlg.h/.cpp // 主對(duì)話框日志、在線列表、廣播下發(fā) │ ├── ListenSocket.h/.cpp // CAsyncSocket 派生只負(fù)責(zé) accept │ └── ClientSocket.h/.cpp // 每個(gè)連接一個(gè)實(shí)例負(fù)責(zé)收、發(fā)、切包 └── Client/ ├── ClientApp.h/.cpp ├── ClientDlg.h/.cpp └── ClientSocket.h/.cppListenSocket和ClientSocket都從CAsyncSocket派生但職責(zé)完全不同前者一輩子只干一件事——把新連接從內(nèi)核隊(duì)列里撈出來后者是“一線工人”一個(gè)實(shí)例對(duì)應(yīng)一條 TCP 連接負(fù)責(zé)這條鏈路上的全部讀寫和異常處理。把這兩件事拆開后面加“最大連接數(shù)限制”“IP 黑名單”才有地方插。ServerDlg只做三件事接按鈕、寫日志、維護(hù)在線列表。它不直接持有 socket 的讀寫邏輯所有網(wǎng)絡(luò)事件通過自定義窗口消息回到這里這樣界面線程永遠(yuǎn)不會(huì)被阻塞。類基類職責(zé)生命周期CListenSocketCAsyncSocket監(jiān)聽端口處理 OnAccept與主對(duì)話框同壽CClientSocketCAsyncSocket單連接收發(fā)、切包、斷線檢測(cè)連接建立時(shí) new連接關(guān)閉后 deleteCServerDlgCDialogExUI、日志、連接表托管整個(gè)進(jìn)程PacketBuffer無自寫粘包拆包歸屬 CClientSocket2.2 三種寫法怎么選原生 Winsock、CAsyncSocket、CSocket原生 Winsock 最透明WSAStartup、socket、bind、listen、select全部自己管代價(jià)是事件分發(fā)要手寫一個(gè)select循環(huán)套著幾十行FD_ISSET判斷新手很容易在錯(cuò)誤處理上栽跟頭。CAsyncSocket是 MFC 對(duì) Winsock 的薄封裝底層通過異步窗口消息把FD_ACCEPT、FD_READ、FD_WRITE、FD_CLOSE轉(zhuǎn)成虛函數(shù)回調(diào)也就是常說的OnAccept、OnConnect、OnReceive、OnSend、OnClose。它不會(huì)阻塞調(diào)用線程天然適合掛在對(duì)話框上跑。CSocket又往下派生了一層內(nèi)部自帶一個(gè)隱藏窗口和阻塞循環(huán)配合CSocketFileCArchive能寫出接近文件讀寫的代碼。上手最快但坑也集中阻塞特性會(huì)卡住 UI 線程和CArchive搭配時(shí)Receive讀到的字節(jié)數(shù)和對(duì)端Send的字節(jié)數(shù)沒有一一對(duì)應(yīng)關(guān)系半包一來就拋異常而且異常棧往往看不出真正原因。這個(gè)項(xiàng)目選CAsyncSocket理由很實(shí)際協(xié)議體就是二進(jìn)制塊和字符串沒有復(fù)雜的對(duì)象序列化需求異步回調(diào)配上自己維護(hù)的收包緩沖區(qū)控制權(quán)在我手里。常見做法是——消息頻率低、協(xié)議簡(jiǎn)單CAsyncSocket足夠真要傳大文件、需要做背壓控制反過來用獨(dú)立工作線程加阻塞 socket把收發(fā)和 UI 徹底隔離反而更省心。3. 服務(wù)端拆解監(jiān)聽、accept 和多連接托管服務(wù)端是整條鏈路的起點(diǎn)它出問題的表現(xiàn)往往很隱蔽——客戶端那邊只看到“連接被拒絕”或者“連上三秒就斷”真正的原因藏在服務(wù)端的初始化順序和對(duì)象生命周期里。3.1 初始化和監(jiān)聽AfxSocketInit 到 ListenAfxSocketInit()必須在任何 socket 調(diào)用之前執(zhí)行它內(nèi)部完成了WSAStartup并把版本號(hào)協(xié)商好。放到CWinApp::InitInstance的最前面是最省事的做法漏掉這一步后面所有 socket 調(diào)用都會(huì)返回WSAStartup未執(zhí)行的錯(cuò)誤而且錯(cuò)誤碼不直觀。// ServerApp.cpp BOOL CServerApp::InitInstance() { // 必須在任何 socket 調(diào)用之前完成 Winsock 初始化 if (!AfxSocketInit()) { AfxMessageBox(_T(Winsock 初始化失敗程序退出)); return FALSE; } CWinApp::InitInstance(); CServerDlg dlg; m_pMainWnd dlg; dlg.DoModal(); return FALSE; // 對(duì)話框關(guān)閉即結(jié)束不再進(jìn)入默認(rèn)消息循環(huán) }InitInstance的返回值這里特意給了FALSE。原因是主界面是模態(tài)對(duì)話框DoModal返回意味著用戶已經(jīng)關(guān)窗此時(shí)如果再進(jìn)CWinApp::Run的消息循環(huán)進(jìn)程會(huì)卡在一個(gè)沒有窗口的循環(huán)里任務(wù)管理器里看著像僵尸進(jìn)程。真正開始監(jiān)聽的動(dòng)作放在對(duì)話框的按鈕響應(yīng)里方便反復(fù)啟停// ServerDlg.cpp —— “開始監(jiān)聽”按鈕 void CServerDlg::OnBnClickedBtnListen() { if (m_pListen ! nullptr) return; // 防重復(fù)點(diǎn)擊 m_pListen new CListenSocket(this); if (!m_pListen-Create(m_nPort, SOCK_STREAM)) { DWORD err GetLastError(); AppendLog(_T(創(chuàng)建監(jiān)聽套接字失敗錯(cuò)誤碼 %u), err); delete m_pListen; m_pListen nullptr; return; } if (!m_pListen-Listen(5)) { AppendLog(_T(Listen 失敗錯(cuò)誤碼 %u), GetLastError()); m_pListen-Close(); delete m_pListen; m_pListen nullptr; return; } AppendLog(_T(已在 %u 端口開始監(jiān)聽), m_nPort); GetDlgItem(IDC_BTN_LISTEN)-EnableWindow(FALSE); }Create的第一個(gè)參數(shù)是端口傳 0 會(huì)讓系統(tǒng)隨機(jī)分配一個(gè)可用端口這在做多實(shí)例自測(cè)時(shí)很有用通過GetSockName能拿回實(shí)際端口。第二個(gè)參數(shù)SOCK_STREAM對(duì)應(yīng) TCPSOCK_DGRAM是 UDP寫錯(cuò)了不會(huì)編譯報(bào)錯(cuò)但行為完全不同。Listen的參數(shù)是 backlog指的是內(nèi)核等待隊(duì)列的長(zhǎng)度不是最大并發(fā)連接數(shù)很多人以為調(diào)大它就等于提高并發(fā)上限實(shí)際上它只影響“三次握手完成但還沒被 accept 取走”的連接能排多長(zhǎng)隊(duì)。這個(gè)值一般給 5 到 10 就夠局域網(wǎng)工具用。GetLastError返回 10048 是端口被占用八成是上一次調(diào)試時(shí)進(jìn)程沒退干凈返回 10013 是權(quán)限不夠通常是端口號(hào)小于 1024。3.2 OnAccept一次事件里把隊(duì)列收干凈CAsyncSocket的OnAccept是邊沿觸發(fā)式的通知——內(nèi)核告訴你“有連接進(jìn)來了”但不會(huì)告訴你“有幾個(gè)”。如果回調(diào)里只Accept一次而恰好同一瞬間來了三個(gè)客戶端剩下的兩個(gè)就會(huì)一直躺在隊(duì)列里直到下一次有新連接觸發(fā)事件才被順手取走。表現(xiàn)出來就是“客戶端連上了但服務(wù)端列表里沒有”或者“第二個(gè)客戶端連不上”。// ListenSocket.cpp void CListenSocket::OnAccept(int nErrorCode) { if (nErrorCode ! 0) { m_pDlg-AppendLog(_T(OnAccept 錯(cuò)誤碼 %d), nErrorCode); CAsyncSocket::OnAccept(nErrorCode); return; } // 循環(huán) accept直到隊(duì)列里沒有待處理連接 for (;;) { CClientSocket* pClient new CClientSocket(m_pDlg); if (!Accept(*pClient)) // 失敗說明隊(duì)列空了或者出錯(cuò) { delete pClient; // 這里必須回收否則每來一次事件泄漏一個(gè)對(duì)象 break; } m_pDlg-AddClient(pClient); // 交給主對(duì)話框托管進(jìn)入在線列表 } CAsyncSocket::OnAccept(nErrorCode); }Accept的第一個(gè)參數(shù)是“用來承載新連接的CAsyncSocket對(duì)象”所以必須在調(diào)用前 new 出來。失敗時(shí)一定要delete這是最容易漏的一行——每次空 accept 都會(huì)泄漏一個(gè)對(duì)象和它內(nèi)部持有的 SOCKET 句柄跑一晚上能把句柄耗光最后表現(xiàn)成“新連接全都失敗”。循環(huán)的退出條件就是Accept返回FALSE此時(shí)GetLastError通常是WSAEWOULDBLOCK意思是隊(duì)列已經(jīng)空了正常情況不用當(dāng)錯(cuò)誤處理。3.3 連接對(duì)象托管和銷毀誰 new 誰 delete服務(wù)端的連接表放在CServerDlg里用CArrayCClientSocket*, CClientSocket*或者std::vector都行。關(guān)鍵約定只有一條對(duì)象由對(duì)話框創(chuàng)建、由對(duì)話框刪除CClientSocket自己絕不delete this。斷線時(shí)OnClose會(huì)被觸發(fā)但此時(shí)對(duì)象還在 MFC 的異步通知鏈路里直接刪自己會(huì)導(dǎo)致回調(diào)返回后訪問已釋放內(nèi)存典型表現(xiàn)是關(guān)閉客戶端后服務(wù)端彈“內(nèi)存不能為 read”。// ClientSocket.cpp void CClientSocket::OnClose(int nErrorCode) { // 不能在這里 delete this拋回 UI 線程統(tǒng)一釋放 if (m_pDlg ! nullptr) m_pDlg-PostMessage(WM_CLIENT_GONE, (WPARAM)this, 0); CAsyncSocket::OnClose(nErrorCode); } // ServerDlg.cpp —— 自定義消息的處理 LRESULT CServerDlg::OnClientGone(WPARAM wParam, LPARAM) { CClientSocket* pClient reinterpret_castCClientSocket*(wParam); RemoveClient(pClient); // 從在線列表移除 pClient-Close(); // 先關(guān)句柄 delete pClient; // 再刪對(duì)象 return 0; }PostMessage和SendMessage在這里有本質(zhì)區(qū)別PostMessage只是投遞立即返回不會(huì)在 socket 回調(diào)里同步執(zhí)行刪除邏輯SendMessage會(huì)等待消息處理完才返回等于在回調(diào)里就把自己刪了必崩。注意Close()要和delete分開寫順序反了會(huì)導(dǎo)致CAsyncSocket析構(gòu)時(shí)去關(guān)一個(gè)已失效的句柄調(diào)試版會(huì)彈斷言。4. 收發(fā)層拆解粘包、半包和跨線程回 UITCP 是字節(jié)流不是消息流。這條常識(shí)誰都背得出但真寫起來Receive一次讀到半條消息、或者兩條消息粘在一起的情況幾乎每個(gè)人都會(huì)遇到一次。收發(fā)層的設(shè)計(jì)目標(biāo)就一個(gè)讓上層拿到的一定是完整的一條消息。4.1 定長(zhǎng)包頭加變長(zhǎng)包體協(xié)議頭固定 12 字節(jié)包體長(zhǎng)度可變這樣切包邏輯最簡(jiǎn)單也最不容易出錯(cuò)。// Protocol.h #pragma once #include WinSock2.h #define PKT_MAGIC 0x4D464354 // MFCT用來快速判斷是不是自己的協(xié)議 #pragma pack(push, 1) // 必須 1 字節(jié)對(duì)齊否則 sizeof 會(huì)帶上填充字節(jié) struct PacketHeader { UINT32 magic; // 魔數(shù)防串協(xié)議 UINT32 length; // 包體字節(jié)數(shù)網(wǎng)絡(luò)字節(jié)序 UINT16 type; // 消息類型 UINT16 reserved; // 預(yù)留方便以后擴(kuò)展 }; #pragma pack(pop) enum PacketType : UINT16 { MSG_LOGIN 1, // 客戶端上線 MSG_TEXT 2, // 文本消息 MSG_HEART 3, // 心跳 MSG_LOGOUT 4 // 主動(dòng)下線 }; static const UINT32 MAX_BODY_LEN 1024 * 1024; // 單包上限 1MB防惡意超長(zhǎng)包#pragma pack(push, 1)這行不能省。默認(rèn)對(duì)齊下UINT32 UINT32 UINT16 UINT16剛好 12 字節(jié)沒問題但只要以后加一個(gè)UINT8字段編譯器就會(huì)補(bǔ) 3 個(gè)填充字節(jié)兩端算出來的sizeof不一致切包直接錯(cuò)位而且錯(cuò)得很隨機(jī)——改了結(jié)構(gòu)體的人自己測(cè)沒事別人拉下來就崩。length字段走網(wǎng)絡(luò)字節(jié)序發(fā)送前htonl收到后ntohl。x86 是小端兩端都是 Windows 時(shí)看著“不轉(zhuǎn)也能跑”一旦以后接個(gè) ARM 板子或者用別的語言寫客戶端立刻翻車。這個(gè)轉(zhuǎn)換成本幾乎為零沒有理由省。4.2 OnReceive 里循環(huán)讀到 WSAEWOULDBLOCKOnReceive同樣是“有數(shù)據(jù)了”的邊沿通知一次回調(diào)里內(nèi)核緩沖區(qū)可能已經(jīng)堆了好幾 KB。只Receive一次的話剩下的數(shù)據(jù)要等下一次事件而如果對(duì)端就發(fā)了這一批然后不說話剩下的字節(jié)會(huì)一直卡著表現(xiàn)成“消息只收到一半就沒了”。// ClientSocket.cpp void CClientSocket::OnReceive(int nErrorCode) { if (nErrorCode ! 0) { OnPeerGone(); return; } char buf[4096]; for (;;) { int n Receive(buf, sizeof(buf)); if (n SOCKET_ERROR) { int err GetLastError(); if (err WSAEWOULDBLOCK) break; // 讀空了正常退出 OnPeerGone(); // 其他錯(cuò)誤按斷線處理 return; } if (n 0) { OnPeerGone(); // 對(duì)端正常關(guān)閉 return; } m_recvBuf.Append(buf, n); } ParseBuffer(); // 緩沖夠了就切包分發(fā) CAsyncSocket::OnReceive(nErrorCode); }三個(gè)退出條件要分清楚WSAEWOULDBLOCK是“暫時(shí)沒數(shù)據(jù)了”屬于正常n 0是 FIN 包對(duì)端主動(dòng)關(guān)了其他錯(cuò)誤碼才是真異常比如 10054 是連接被對(duì)端重置。ParseBuffer負(fù)責(zé)把緩沖區(qū)里的字節(jié)按包頭切開// ClientSocket.cpp void CClientSocket::ParseBuffer() { while (m_recvBuf.GetSize() (int)sizeof(PacketHeader)) { PacketHeader hdr; memcpy(hdr, m_recvBuf.GetData(), sizeof(hdr)); if (hdr.magic ! PKT_MAGIC) { Close(); return; } // 不是本協(xié)議直接斷 UINT32 bodyLen ntohl(hdr.length); if (bodyLen MAX_BODY_LEN) { Close(); return; } // 防御性檢查 int total sizeof(hdr) (int)bodyLen; if (m_recvBuf.GetSize() total) break; // 半包等下一批數(shù)據(jù) Dispatch(hdr.type, m_recvBuf.GetData() sizeof(hdr), (int)bodyLen); m_recvBuf.RemoveHead(total); // 消費(fèi)掉這一包 } }bodyLen的合法性檢查看起來多余實(shí)際上是一條防線如果對(duì)端發(fā)來一個(gè)聲稱 4GB 長(zhǎng)度的包頭沒有這行判斷后面的GetSize() total永遠(yuǎn)為真緩沖區(qū)會(huì)一路漲到內(nèi)存爆掉而日志里什么都不會(huì)打印屬于典型的黑匣子問題。4.3 Send 只發(fā)出去一部分怎么辦Send的返回值是“本次實(shí)際寫進(jìn)內(nèi)核發(fā)送緩沖區(qū)的字節(jié)數(shù)”它可能小于你請(qǐng)求的長(zhǎng)度。局域網(wǎng)內(nèi)幾乎不會(huì)發(fā)生但在批量廣播或者對(duì)端接收窗口滿的時(shí)候就會(huì)出現(xiàn)。忽略返回值、直接認(rèn)為發(fā)送成功是這類程序最常見的隱性 bug。// ClientSocket.cpp bool CClientSocket::SendPacket(UINT16 type, const void* body, UINT32 bodyLen) { if (m_hSocket INVALID_SOCKET) return false; PacketHeader hdr; hdr.magic PKT_MAGIC; hdr.length htonl(bodyLen); hdr.type type; hdr.reserved 0; // 先把包頭和包體拼成一個(gè)連續(xù)緩沖區(qū)再發(fā)避免兩次 Send 之間插進(jìn)別的包 CByteArray pkt; pkt.SetSize(sizeof(hdr) bodyLen); memcpy(pkt.GetData(), hdr, sizeof(hdr)); if (bodyLen 0) memcpy(pkt.GetData() sizeof(hdr), body, bodyLen); int total (int)pkt.GetSize(); int sent 0; while (sent total) { int n Send(pkt.GetData() sent, total - sent); if (n SOCKET_ERROR) { int err GetLastError(); if (err WSAEWOULDBLOCK) { // 發(fā)送緩沖區(qū)滿簡(jiǎn)單項(xiàng)目里直接視為失敗交給上層重連 return false; } return false; } sent n; // 必須累加否則會(huì)重復(fù)發(fā)送同一段數(shù)據(jù) } return true; }把包頭和包體拼成一次Send是刻意的如果先發(fā)頭、再發(fā)體中間被別的線程插進(jìn)來發(fā)了一個(gè)包對(duì)端就會(huì)按“頭-別人的頭-別人的體-自己的體”切直接錯(cuò)亂。要么拼成整塊發(fā)要么加發(fā)送隊(duì)列串行化簡(jiǎn)單項(xiàng)目選前者。WSAEWOULDBLOCK在發(fā)送側(cè)的處理要按場(chǎng)景定聊天工具可以失敗重試廣播場(chǎng)景最好維護(hù)一個(gè)發(fā)送隊(duì)列等OnSend回調(diào)來了再繼續(xù)。這里為了代碼量控制直接返回失敗由上層提示“發(fā)送失敗”。4.4 跨線程回 UIPostMessage 加堆對(duì)象CAsyncSocket的回調(diào)運(yùn)行在 MFC 的異步通知線程里直接在這些回調(diào)里操作控件輕則界面卡頓重繪異常重則彈斷言。穩(wěn)妥做法是把數(shù)據(jù)打包用PostMessage投遞到主線程。// ClientSocket.cpp void CClientSocket::Dispatch(UINT16 type, const void* body, int len) { // 堆上分配接收方負(fù)責(zé) delete避免跨線程共享 CString CString* pMsg new CString((LPCSTR)body, len); switch (type) { case MSG_TEXT: m_pDlg-PostMessage(WM_PEER_TEXT, (WPARAM)pMsg, (LPARAM)m_hSocket); break; case MSG_HEART: m_pDlg-PostMessage(WM_PEER_HEART, (WPARAM)m_hSocket, 0); delete pMsg; // 心跳不帶內(nèi)容立刻回收 break; default: delete pMsg; break; } } // ServerDlg.cpp —— 主線程處理 LRESULT CServerDlg::OnPeerText(WPARAM wParam, LPARAM lParam) { CString* pMsg reinterpret_castCString*(wParam); AppendLog(_T([%u] %s), (unsigned)lParam, *pMsg); delete pMsg; // 誰接收誰釋放 return 0; }堆對(duì)象是必須的PostMessage是異步的如果用棧對(duì)象地址消息還沒被處理函數(shù)地址就失效了。同理不能直接傳CString引用。約定好“接收方負(fù)責(zé) delete”代碼里每一處都照做就不會(huì)漏。CString這里按LPCSTR構(gòu)造意味著協(xié)議體按 ANSI 處理。如果客戶端要發(fā)中文又不想踩編碼坑統(tǒng)一改成 UTF-8發(fā)送端把CStringW轉(zhuǎn) UTF-8 字節(jié)流接收端用MultiByteToWideChar轉(zhuǎn)回來再顯示兩端一致就行最怕的是一端用CStringA一端用CStringW。5. 避坑與排查MFC Socket 最容易出問題的四個(gè)位置這一節(jié)的現(xiàn)象都是我在調(diào)試這套結(jié)構(gòu)時(shí)真實(shí)撞過的順序按“從啟動(dòng)到退出”排。5.1 連接建立階段的坑現(xiàn)象一點(diǎn)了“連接”客戶端界面直接卡死幾秒然后提示超時(shí)。原因在 UI 線程里用了CSocket的阻塞式Connect或者用CAsyncSocket::Connect之后立刻彈了個(gè)模態(tài)框。前者會(huì)把消息循環(huán)堵死后者會(huì)讓OnConnect永遠(yuǎn)進(jìn)不來——CAsyncSocket的事件是靠窗口消息驅(qū)動(dòng)的模態(tài)對(duì)話框自己跑了一套消息循環(huán)異步通知被吞掉了。解決連接動(dòng)作只調(diào)Connect立即返回結(jié)果全在OnConnect里處理用nErrorCode判斷成功與否。非要在等待期間給用戶反饋用非模態(tài)對(duì)話框或者直接置灰按鈕加一句“連接中”。超時(shí)交給系統(tǒng)Connect本身有內(nèi)核級(jí)超時(shí)想要更短就自己起個(gè)定時(shí)器超時(shí)后Close掉重來。現(xiàn)象二服務(wù)端顯示監(jiān)聽成功客戶端就是連不上錯(cuò)誤碼 10061。原因Windows 防火墻攔了。第一次運(yùn)行編出來的 exe系統(tǒng)會(huì)彈一個(gè)“是否允許訪問網(wǎng)絡(luò)”的框如果當(dāng)時(shí)點(diǎn)了取消之后這個(gè)程序的所有入站連接都會(huì)被靜默丟棄而且不會(huì)再?gòu)椀诙巍=鉀Q到防火墻的“允許應(yīng)用通過”里把這個(gè) exe 勾上或者調(diào)試期間臨時(shí)關(guān)掉專用網(wǎng)絡(luò)的防火墻。順帶一個(gè)經(jīng)驗(yàn)調(diào)試時(shí)用 127.0.0.1 先確認(rèn)邏輯通不通再換局域網(wǎng) IP 測(cè)能把“防火墻問題”和“代碼問題”分開。綁定地址用INADDR_ANY而不是127.0.0.1后者只接受本機(jī)連接別的機(jī)器連過來會(huì)被拒。5.2 收發(fā)階段的坑現(xiàn)象三中文消息收到一半是亂碼或者最后幾個(gè)字變成方塊。原因發(fā)送端按CString的GetLength()算字節(jié)數(shù)接收端按字節(jié)構(gòu)造CString。CString在 Unicode 工程里是寬字符GetLength()返回的是字符數(shù)一個(gè)漢字算 1占內(nèi)存卻是 2 字節(jié)長(zhǎng)度對(duì)不上。另一個(gè)常見原因是直接用strlen算 UTF-8 字符串長(zhǎng)度遇到中文也會(huì)偏。解決協(xié)議體一律按字節(jié)流處理。發(fā)送前明確轉(zhuǎn)成std::string或者CByteArray長(zhǎng)度取字節(jié)數(shù)接收端用MultiByteToWideChar(CP_UTF8, ...)轉(zhuǎn)回寬字符再顯示。兩端的編碼約定寫進(jìn)Protocol.h的注釋里誰改誰負(fù)責(zé)?,F(xiàn)象四客戶端發(fā) 10 條消息服務(wù)端日志里只有 3 條內(nèi)容還是拼接的。原因OnReceive只調(diào)了一次Receive剩下的字節(jié)留在內(nèi)核緩沖區(qū)等下次事件而客戶端是連續(xù)Send的短時(shí)間內(nèi)不會(huì)再觸發(fā)新事件數(shù)據(jù)就一直卡著。另一種情況是切包邏輯里RemoveHead的長(zhǎng)度算錯(cuò)把下一包的頭也吃掉了。解決按 4.2 的寫法Receive循環(huán)到WSAEWOULDBLOCK為止切包時(shí)嚴(yán)格用sizeof(PacketHeader) ntohl(length)作為消費(fèi)長(zhǎng)度別憑感覺寫常量。調(diào)試期在ParseBuffer里加一行日志打印緩沖區(qū)當(dāng)前長(zhǎng)度和切出來的包長(zhǎng)跑十幾條消息就能看出規(guī)律。5.3 關(guān)閉和退出階段的坑現(xiàn)象五關(guān)掉客戶端之后服務(wù)端再啟動(dòng)就報(bào)端口被占用10048。原因TIME_WAIT狀態(tài)主動(dòng)關(guān)閉的一方會(huì)在這個(gè)狀態(tài)停留幾十秒。調(diào)試時(shí)反復(fù)啟停端口就一直被上一個(gè)進(jìn)程占著。解決監(jiān)聽前給 socket 設(shè)SO_REUSEADDRMFC 里用SetSockOpt// ListenSocket.cpp —— 在 Create 之前或之后都可以但必須在 Listen 之前 int opt 1; m_pListen-SetSockOpt(SO_REUSEADDR, opt, sizeof(opt), SOL_SOCKET);注意SO_REUSEADDR只是讓綁定不被TIME_WAIT擋住不是讓兩個(gè)進(jìn)程同時(shí)監(jiān)聽同一端口。真正同時(shí)監(jiān)聽要靠SO_REUSEPORTWindows 上的語義和 Linux 不一致跨平臺(tái)項(xiàng)目別指望它。另外退出時(shí)記得按“先Close所有連接再Close監(jiān)聽最后讓CWinApp正常返回”的順序收尾。漏掉某一步的表現(xiàn)是進(jìn)程在任務(wù)管理器里掛著不退下一次調(diào)試端口還是占著。6. 二次開發(fā)把它改成一個(gè)真能干活的工具這套骨架跑通之后改造成本主要花在三個(gè)地方按投入產(chǎn)出比排。第一是加心跳和超時(shí)踢人。協(xié)議里已經(jīng)留了MSG_HEART服務(wù)端維護(hù)一個(gè)mapSOCKET, time_t起一個(gè)SetTimer每 30 秒掃一遍超過 90 秒沒更新的連接直接Close并從在線列表移除。沒有這一步客戶端拔網(wǎng)線、進(jìn)程被強(qiáng)殺這類情況服務(wù)端完全感知不到在線列表會(huì)一直掛著一堆僵尸連接廣播時(shí)還要往死連接上寫。第二是把廣播做對(duì)。別在 UI 線程里循環(huán)調(diào)SendPacket客戶端一多界面就卡。做法是給每個(gè)CClientSocket掛一個(gè)std::dequeCByteArray發(fā)送隊(duì)列UI 線程只負(fù)責(zé)push真正的Send放在各自的OnSend回調(diào)里推進(jìn)寫不動(dòng)了就停等下一次可寫事件繼續(xù)。這個(gè)改造大概幾十行但決定了這套東西能帶 5 個(gè)客戶端還是 50 個(gè)。第三是換成二進(jìn)制協(xié)議?,F(xiàn)在包體是文本解析靠字符串字段一多就難維護(hù)。把MSG_LOGIN的包體定義成struct同樣#pragma pack(push, 1)讀寫時(shí)逐字段memcpy配合包頭里的type做分發(fā)擴(kuò)展新消息只要在Protocol.h里加一個(gè)枚舉值和一個(gè)結(jié)構(gòu)體。改造點(diǎn)改動(dòng)位置大致工作量解決的問題心跳超時(shí)CServerDlg 定時(shí)器半天僵尸連接、在線狀態(tài)不準(zhǔn)發(fā)送隊(duì)列CClientSocket一天UI 卡頓、大廣播丟包二進(jìn)制協(xié)議Protocol.h ParseBuffer一天字段擴(kuò)展、解析性能驗(yàn)證方法上我會(huì)準(zhǔn)備兩個(gè)客戶端實(shí)例再加一個(gè)用腳本寫的假客戶端。腳本那邊故意一次只發(fā) 3 個(gè)字節(jié)把包頭拆成兩批送專門驗(yàn)證半包處理再故意連上不登錄驗(yàn)證服務(wù)端的超時(shí)邏輯最后用taskkill強(qiáng)殺客戶端看服務(wù)端多久能從在線列表里把它清掉。這三種病態(tài)輸入跑過一遍基本就敢往設(shè)備上掛了。從那以后我每次寫這類帶網(wǎng)絡(luò)的小工具都會(huì)先把“發(fā)包不完整、收包不完整、連接突然消失”這三件事的日志打點(diǎn)加進(jìn)第一版而不是等出問題了再回來補(bǔ)。調(diào)試網(wǎng)絡(luò)問題最貴的是信息日志里多一行緩沖區(qū)長(zhǎng)度可能省掉一整晚。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
人妻黑丝袜电影| 青青草原人妻| 美国aaaaa一级黄片| 亚洲欧美情色| 男女做爰猛烈动高潮A片免费应用| 久久 精品| 高清无码91| 伊人影院综合是一个与深夜成人在线| blacked精品一区国产| 国产成人免费观看在线视频| 亚洲天堂第一页| 中文字幕制服欧美久久一区| 日本天天干天天操一区| 色九九综合AV| 97在线视频观看| V A在线| 精品毛片久久久精品毛片| 超碰人人草| 四虎视频在线观看| 国产成人超碰在线| 欧美亚涩| 日韩视频中文字幕| 蜜臀久久久久久999| 男人的天堂Va| 91精品久久久久久综合五月天| 久九九九九九九热| 精品中文字幕一区二区l - 百度| 91无摭挡| 在线观看日韩av不卡| 国产精品久久久久久无码红治院| 成人资源中文字幕在线观看天天| 精品999999| 色色婷婷丁香| 五月丁香激情四射| 超碰天天操你比| 亚洲黄片免费在线播放| 久久日本熟女精品一区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 无码人妻一区二区三区色欲aⅴ| 国产成人精品无码久久| 丝袜美腿操av| 少妇被玩视频二三区| 影音先锋新男人| 蜜桃视频精品一区二区三区| 欧美性性性| 久久久国产成人一区二区三区在线| 密臀AV在线| 日本免费人成视频播放120秒| 97超级色碰碰| 91色碰| 九月丁香婷婷色| 操逼网站地址| 成人午夜高潮av猛片| 99操| 国产玖玖| 中国探花熟女| 亚洲不卡三级手机播放| 白丝少妇一区二区| 97啪啪| 青草青青久久久久久国产| 99色色网| 国产午夜激片Av毛片不卡| 美女上床网站| 韩国毛片一区二区三区| 色一射色一射| 国产成人精品亚洲日本| 国产欧美一级在线观看| 黄色小视频日本txt| 九九热九九| 色天天野狼综合社区| www超碰| 欧美综合色综合| 国模少妇一区二区三区| 日本欧美一区二区三区视频麻豆| 搡老女人老91妇女老熟女| 超碰1997| 中文熟女五十乱码在线| 欧美在线综合| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 97视频7| 猛交交| 看日韩美女二区三区免费操逼视频| 丁香五月综合| 男男H黄动漫啪啪无遮挡网站| 久久性爱网站| 少妇 综合| 超碰人人草| 激情开心五月天| 欧美性爱另类综合| 久久久久9久久久久| 加勒比无码一区二区三区| 日本亚洲vr欧美不卡高清专区| 天天色综合图片| 亚洲 自拍偷拍 欧美| 91丝袜在线播放| 啪啪啪男女亚洲中文字幕99| 91国产操逼视频| 超碰成人国产| 90后性网国产欧美| 懂色综合久久久| wwe 天天干.com| 九九热精彩视频| 超碰97在线色男人??| 91久久久久| 日韩无码极品| 亚洲欧美日韩精品久久久一区二区 | 国产精品午夜AV完会免费| 大香蕉伊人久久| 男人下部插入女人下部| 草草草视频| 爽极品影院| 免费观看网黄| 国产999精品久久久久久| 婷婷精品| 玖玖超碰熟| 久久天堂| 久久久艹艹艹| 97干97色| 成人贴图日韩欧美| 无码人妻精品一区二区三区99不卡| 强奸乱伦日韩AV| 亚洲三级网址久久最新| 欧美日韩国产传媒在线精品| 伦理片秋霞免费影院| www.狠狠干.coom| 夜夜嗨老熟女AV一区二区三区| 9丨久久九九九 | 人人干人人搞人人摸| 岛国人妻少妇av在线观看| 久射吧| 日本性爱欧美性爱| 亚洲成人色情五月天丁香花| 久久久久九九九九| 午夜精品99久久久久传媒| 最新制服中文第一页| 又黄又硬又粗又长国产视频| 国产野战露脸在线播放| 一道本东京热加勒比一区二区三区| 啊啊啊水好多| 日韩性色b| 亚洲18禁| 亚洲丰满很很操| 八戒午夜福利理论片| 精品视频日日夜夜| 人妻一区二区三区四区视频| 成人A片男人的天堂| www.久久制服糖| 超碰在97| 性欧美天天| 亚洲 一区二区 自拍| 后入福利| 97色视频在线| 99ri在线视频| 日韩av不卡在线看| 亚洲综合电影| 丰满搜索结果 -第18页- 久久高清无码 | 精品中文一区二区| 久久人妻视频| 国产69精品久久久久99尤物| 国产精品久久久无码AV网站| 国产色产精品在线观看| 青青青草伊人精品| 久久精品一区二区| 97操综合| 今日头条成人一区二区三区四虎精品| 亚洲?V无码专区在线电影| 国产视频97| 欧美性,亚州色| 99国产人成精品| 欧美极品性爱天天射| 嗯嗯啊啊好爽| 精品国产99999| 欧美午夜视频| 欧美亚州综合图片| 天天享受天天看| 欧美在线官网| 一起草精品人妻| 久久首页| 日本熟女中文字幕一区| 国产91啪| 天天爱天天韩国日本牛牛牛牛 | 国产精品麻豆成人av| 男人干美女| 91粉嫩萝控精品福利网站_精品影音先锋国| 富女玩鸭子一级毛片| www.av家庭乱伦| 91精品91久久久久77777俄罗斯老妇姓x| 无码精品久久| 亚洲精品人妻在线| 久久男女激情视频网站| 蜜桃av综合网发布| 婷婷丁香六月天| 91久久久久久| 久久色激情一区二区三区| 97亚洲综合电影| 欧美狠狠弄| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 中文字幕五月婷婷免费| 五月婷在线| 日韩欧美大力操| 婷婷六月天| 中文字幕黄色片| 国产AV高清AV无码| 99999精品成人| 超碰地址97| 大香蕉中文201| 天天看,天天做| 亚洲一区中文字幕一区| 老师充足的奶水小说| 97一区二区三区视频| 99热这里都是精品| 国产高清免费不卡av| 中文字幕日本久久| 国产毛片片精品天天看视频| av三级电影在线播放| 久久超碰天天| xxxx网站亚洲精品| 国产av白丝| 玖玖无码超碰| 无码一区免费在线不卡| 99热免费| 欧美92| 亚洲黄色a级片| 偷拍亚洲高清图片| 欧美激情视频在线一区| 九九热免费在线国产视频伊人五月| 97人人色| 九九热免费国产视频婷婷伊人 | 亚洲图片偷拍视频区| 久久綜合很很很| 手机在线大香蕉| 国产成人在线观看综合| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 天天躁日日躁成人字幕aⅴ| 欧美夜夜狠| 综合网天天| 97国产超湿| 欧美精品一区二区少妇免费A片| 国产精品视频电影| 国产精品原创巨作?v网站| 爱干爱射网啊啊啊| 黄色香蕉视频网站一区| 免费网色网站| 这里只有精品视频在线观看麻豆| 91 国产丝袜在线播放-百度| 夜夜肏2021| 夜夜爽夜夜爽| 蜜桃一区二区三区| AV色天香在线| 蜜臀久久久国产| 人人超碰在线观看黄| 精品人妻免费观看| 无卡一区=区| 全球成人中文在线| 小说区 图片区色 综合区| 95精品在线| 激情五月天插| 97超碰日韩| 精品二999| www久久99| 91丨豆花丨熟女| 亚洲污污网站| 成人乱码一区二区三少妇| 性色国产东北露脸精品视频| 日韩av在线播放不卡| 国产精品乱码久久久| 加勒比大香蕉视频在线| 麻豆伊人网| 在线视频免费播放一区| 干b网| 亚洲综合有玛| 日少妇亚洲版| 麻豆天美国美国产| 超碰97资源大奶| 成人AV在线网站| 中文字幕视频2区| 丰满人妻一区二区三区四区| 成人aⅴ一区二区三区| 中文字幕在线观看网址| 超碰97COm中文| 伊人网在线观看| 日本蜜桃| 欧美韩国你懂得在线| 91N五十路| 一品道视频一区二区三区| 长长久久免费视频| 激情另类激情| 超清福利精品视频在线| 亚洲一区中文精品| 久久免费99精品久久久久久| 国产嫩草精品A88AV| 中文熟女五十乱码在线| 久久亚州大香蕉| 男女性扦B| 国产人妻精品一区二区三区秋霞 | 97视频7| 啊啊啊啊啊啊啊啊啊啊在线观看| 97色色色综合网站| 成人一级二级| 性色高清..……| 极品久久久久久久久久久久久久| 蜜桃精品一区二区三区ww| 97香焦色区| 日本不卡二三区| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 97超碰色屌| 亚洲色婷婷综合久久久久中文| 玖玖蜜臀资源网| 超碰97网址| 91热| 中文字幕aⅴ在线视频| 操91| 九九免费影片| 四虎影视精品| 最新日韩黄片| AV色五月| h4610国产人妻| av凤凰久久久| 热久久无毒不卡| 搡老女人老91妇女熟女| 国产精品久久久久无码A√| 日韩精品中文字幕一| 奶水 人妻 哺乳 在线| 好看的久久不射无码影视影院| 亚洲高潮影院| 乳欲人妻办公室奶水| 婷婷激情一区二区三区俺也去| 亚洲熟女诱惑| 国模精品娜娜一二三区| 97蜜桃综合| 97超碰9| 久9热| 99精品无码| 国产性久久久| 色偷偷综合91久久噜噜| 人妻熟女午夜精品在线| 天天做天天爱| 国产无遮挡| 免费操逼91| 国产四虎在线| 国产成人精品无码久久| 久久熟女嫩草成人片免费| 久热香蕉精品在线视频| 综合网亚洲1| 狼人久草| 老外又粗又长一晚做五次| 欧美白嫩女HD| 中文字幕 码 自拍 视频 区| 熟妇的味道HD中文字幕| 亚州色图欧美色图| 欧美色图亚州激情| AV污污污污| 97K超碰在线| 久久99精品九九久久久婷婷| 亚洲欧美国产日本一区二区三区| 永久电影三级在线观看| 久久9免费视频| 综合网色| 午夜国产成人福利视频| 色噜噜婷婷| 亚洲成a人v欧美综合天堂下载| 中文字幕一区二区三四五区日日骚| 日韩欧美国产高清视频| 国产精品视频91久久| 日日玩天天干| 小明看看网址| 美女91在线观看| 九九内射在线| 日韩在线观看中文字幕视频| 黄人人操人人操| 亚欧洲日韩国产精品| 五月天伊人| 激情综合色| 日韩在线性爱免费视频| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 人妻人人澡人人爽人人| 蜜臀AV成人精品蜜臀AV久久| 欧美性爱97超碰| 强奸乱伦αv片| 色天使亚洲综合在线观看| 天天激情综合站| 少妇被c 黄 免费观看| 亚洲情色在线| 黄网站黄视频网站进入口| 久久久夜夜嗨免费视频| 性久久久| 久操免费电影| 亚洲 中文 欧美 日韩 在线| 日韩美女高潮喷水视频| 人人妻人人操人人乐| 五月色综合| 亚洲国产高清福利视频| 国产操偷| 亚欧国产无码精品在线| 亚洲五月天激情| 91成人在线免费视频| 韩日性爱av| 国产精品免费1区2区视频| 国产AAAAAABBBBB| 欧美日韩啪啪电影| 18禁网站在线播放| 色综合久| 一区二区三区蜜桃成人撸久久东京热| 91久久18禁| 夜夜福利| 麻豆成人AV| 日韩在线观看三级电影| 香蕉欧美| 欧美做爰无码A片视频| 美女人妻色网站| 欧美日韩婷婷中文| 欧美性色欧美| 亚洲一卡二卡在线免费| 我要看免费韩日黄片| 91久久精品国产| 在线一区| 一本色道综合久久欧美| 亚洲色久| 美腿丝袜高跟网免费视频免费视频| 国产吹潮女在线观看| 综合网91| 欧美九九爱| 九九热九九| 国产成自自拍在线观看| 夜夜高潮夜夜爽夜夜爱爱一区| 日本久久女同性恋视频| 亚洲成人免费电影| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 欧亚 另类 久| 免费在线黄片视频| 国产视频三区四区| 国产精品一区二区麻豆| 丝袜美腿制服人妻二区中文字幕| 亚洲欧洲美腿丝袜| 91伊人| 色呦呦、国产精品| 1240青青草一区二区三区视频天爱| 国产真乱mangent| 免费精品无码一级毛片牛牛影视 | 国产av激情无码久久天堂| 99精品网| 亚洲色婷婷综合久久一区二区三区| 国产乱伦性爱区| 欧美高清性猛交| 日韩免费三级黄片电影| 久久神马影院| 黄色高清无码无码破解免费暗网 | 亚州性9| 国语对白在线播放视频| 国产999精品久久久| 99热伊人| 欧美瑟综合| 国产精品色色| 国产中午字一暮区| 97色婷婷| 97免费视频在线观看| 中文字幕性感少妇av| 亚洲激情深爱文学小说网站| 伊人991| 国产精品色片一区二区| 九九九九97| 99热这里只有精品地址| 99人妻| 国产免费一区| 天天射影院| 久久在线观看免费视频| 蜜臀久久久久久999| 久久这里只精品99re66图| 日产精品久久久一区二区| 综合熟女| 丝袜美腿制服人妻二区中文字幕 | 麻豆一区在线| 任你干在线视频| 清纯唯美亚洲综合| 亚洲青色欧美| 欧美图片色综合| 后入式免费视频| 久久人妻无码毛片A片麻豆| 婷婷久久综合| 亚洲激情在线观看一区| 日本三级精品| 91女优在线观看| 天天夜躁日日躁狠狠2002| 97超碰色屌| 激情综合五月| 人人爱人人操人人性| 超碰在线人人射| 欧美精品亚洲精品日韩传电影| 日韩钢筋无码高清啾啾啾| 激情五月综合| 美女被艹尤物视频| 国产精品老师| 无码在线亚洲| 美女国产一区二区久久| 操b在线观看| 天天射天天| 天天看夜夜看日日干| 欧美亚洲系列| 97香蕉网| 色图综合| 日韩综合97p| 免费一级精品啪啪视频| 欧美一区二区三区大综合| 天天日天天插| 精品久久久高清无码| 人人 操人人 操人人| 91在线|亚| 国产激情av女片自拍| 亚洲图片另类| 97中文字幕九区| 91情色在线| 久久久精选| 日韩欧美中文字幕搭讪巨乳美人妻视频| 在线看的av| 夜夜骑天天燥| ...日韩成人一区二区三区字幕| 国产精品午夜精品| 欧美姓爱综合网| 草草草草视频| ?亚洲伊人伊成久久人综合网| www.色操逼| 婷婷四五区| 色欲人妻一区二区在线| 校园激情狠狠四射| 国产东北女人在线视频| 综合网,亚洲,欧美| 国产97/欧美| 91视频综合网| 熟女突然公开看18禁影片 | 最新中文字幕精品在线| 精品 码产区一区二-1080P高清在线www-B029AV| 人人澡人人爽人人精品| 人妻大香蕉| 最新中文字幕精品在线| 秋霞欧美性爰视频| 丁香婷婷大香蕉| 91插B网站| 92午夜免费福利视频| 99热这里只有精品1| 高清无码 国产精品| 色偷偷超碰亚洲| 99ri在线视频| 十八禁av无码免费网站APP| 97鸡把在线视频| 欧美在线播放aaaa| 欧美成97爱| 欧美性色综合网| 亚洲成人性爱网站在线播放| 伊人久久久日韩一区| 亚洲中文字母在线播放| 欧美色老汉| 男人兔费天堂| 国产日产精品久久快鸭的功能介绍| 日韩欧美丝袜诱惑| 乱欲一区二区| 国产辣妈在线视频福利| 婷婷美人网| 超碰人人干| 日韩成人性日韩成人性爱视频在线免费观看 | 久久久一区二区| 亚洲图片激情综合另类| 2026国产精品视频| 婷婷天堂站| 在线观看高清AV| 欧美性色欧美| 亚洲一本色码中文字幕| 一区二区激情国产熟女| 无码最新| 骚乳在线| 亚洲成人免费电影| 国产高清MV操逼视频| 亚洲日韩天堂| 久热精品在线| 久久9免费视频| 99精品丰满人妻| 亚洲av在线免费观看| 99精品在线播放| 久久av成人无码免费| 日韩精品高清资源在线| 国产第11页| 7777欧美成是人在线观看| 欧美青青视频| 人人澡综合涩| 色就色综合| 欧美精品三区| 久久久工口| 在线a v| 精品99999| 91青青在线| 91久久午夜无码鲁丝片久久人妻| 亚洲第一在线视频| 国产精品久久久久久久电影渣男| 亚欧美无遮挡| 大屁股熟女一区二区三区| 吻戏激情性巴克| 日夜尻逼网| 国产精品久久久999| 99这里有精品| 日韩三级一区| 操逼啊啊啊91| 乱性AV| 深喉吞精| 日本男人天堂| 亚洲天堂男| 国产AV天美| 久久精品人体| 无码99| 在线天堂999| 色天使大香蕉| 日本一区二区三区精品| 亚洲一区二区三区麻豆传媒| 毛片视频白嫩| 中文字幕亚洲欧美在线不卡| 亚洲限制级| 熟妇熟女一区二三区| 狠狠搞 亚洲91| 欧美少妇色综合| 婷婷丁香成人| 日韩欧美大片免费高清啪啪| 大香蕉伊人75| 青草成人免费视频一COm| 亚洲久9| 欧美天天综合站| 欧洲一区二区| 久久久涩| 国产欧美日产一区二区三区 - 国产欧美日| 国产精品丝袜久久亚洲不卡| 九九九九免费视频| 96国产精品| 国产精品一二三区18| 国产一区二区三区久久久精品| 天天做天天爱| 色综合av男人天堂| 亚洲另类久操网| 日韩精品人妻中文字幕有码午| av影片在线观看不卡| 亚洲高清综合网| yw尤物av无码点击进入麻豆| 97国产高清视频在线观看| 东京太热久久久| 激情四射婷婷六月天| 久久97超碰| 粉嫩av平台| 色噜噜狠狠色综合日日| 97超碰久久色| 最新岛国大片| 欧美97在线观看| 色综合一区二区三区| 亚洲综合中文字幕有码 | 欧美色97| 日本岛国黄色网址| 午夜九九| 色婷婷六月丁香七月婷婷| 欧美精品日韩久久久九| 亚洲综合一区二区| 伊人热综合| 91M一社| 中文字幕一区 二区三四五 区日 日骚| 极品欧美一区二区三区| 久久精品电影| 青青草国产一区二区三区| 国产欧美美女免费观看视频| 蜜乳AV一区二区三区四| 懂色中文一区二区三区| 易易A毛视频| 果冻国产精品麻豆成人av| 精品视频一区二区| 又黄又硬又粗又长国产视频| 天天综合麻豆视频| 精品亚州18| 丁香五月天啪啪| 乳欲人妻办公室奶水| 日韩无码人妻| 天天夜夜rb| 呻吟 欧美 日本 中出| 日韩AV一区二区三区三州三州| 久久婷婷伊人| 亚欧无码在线| 伦伦成年午夜免费视频| 日本成人免费一区二区三区| 97爱综合| 牛牛AV人人夜夜澡人人爽| 久久久久久九九九九九| 男人天堂新| 97欧美日韩精品| 啊啊啊啊啊啊啊在线| 久久久久久久久久久久黄色| 国产精品青青草| 色情乱伦AV| 国产成人自拍视频在线| 操逼操逼逼操操逼91| 极品综合| 操逼天美3区| 韩国一级做a久久久久| 91精品国产91久久青草| 一区二区三| 日韩亚洲欧美中文字幕| 精品一区二区三区麻豆| 久久97超碰| 亚洲欧美人妻| 欧美AB在线| 夜夜草我| 被男人吃奶很爽的毛片| 国产在线强奸视频| 亚洲五码一区二区三区| 日韩精品在线观看网站| 吖在线不卡一区二区国产剧情| 三级日本一区二区三区| 国产特级毛片AAAAAA高潮流水| 超碰在线观看av不卡| 国产精品色片一区二区| 国产乱伦亚洲| 亚欧成人一级片在线播放| 久久精品国产亚洲粉嫩| 日韩三级av片| 97国产人人| 午夜视频黄| 成人亚欧免费视频| 99色综合| 熟妇视频一区二区三区在线观看| 中文字幕一区二区三区人妻少妇在线| 第二页中文字幕| 亚洲欧美日韩有码| 日韩久草| 欧美情色亚洲| 午夜舔阴达高潮视频免费看| 亚洲阿v天堂在线| 操逼逼中文字幕| 99久久网站| 亚洲男人天堂2012| 狠狠躁天天躁日日躁97| 日韩无码一区二区三区| 内射夫妻三片| 国产在线视视频有精品| 国产精品一二三免费网站| 麻豆天美久久91| 久久爽爽精品| 日日骚一区二区三区| 啊啊啊水好多| 欧美日韩国产成人高清| 国产精品蜜乳AV| 丁香五月av| 神马久久69| 夜夜操一区二区| 国产精品一区二区三区四区五区| 男女啪啪啪18禁网站| 婷婷中文网| 日韩中文字幕熟妇人妻| 91精品国| 久久人人爽爽人人爽人人片αV| 香蕉久久国产AV一区二区| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 国产一区二区三三视频| 丰满的三级少妇欧美久久久| 亚州精品丝袜-不卡成人免费| 久久久女人| 欧美精品99久久久**| 久久一二三四五六七八九区区区| 伊人伊人LD| 亚洲欧美综合| 国产又操| 粉嫩久久久久| 91亚洲人| 亚洲精品亚洲人成人网| 超碰地址97| 老司机深夜18禁污污网站| 一起草AV| 99热一区二区三区四区| 国产51色综合久久免费| 欧美性,色九九| 91性感在线| 久久精品性| 青青草成人视频在线观看二区 | 欧美另类自拍 | 一区二区 日韩 欧美 国产 传媒| 玖玖久久久| 九九热超碰97亚洲最新香蕉| 午夜啊啊| 99热久| 91狠狠狠| 狠狠综合| 国产久9| 久久久婷婷婷| 日本97久久| 日本123区操B视频| 欧美一二级| 国产亚洲精品农村妇女 | 日本熟女免费視颖| 日韩av熟女一区二区三区成人| 亚洲综合电影| 免费的av网| 黄片视频观看| 丝袜性亚洲| 熟妇xxxxx性春色| 亚州色图狠狠干| 正在播放国产精品一区| 二对二中文字幕。| 蜜乳视频网站| 美女97超碰| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 99色在线视频| 人人妻人人澡人人爽久久av| 任你艹| 日本 情色 1区| 亚洲中文字幕网| 亚91网| 久久人妻办公室视频| 精品无码欧美三级| 极品内射| 美女一区二区国产精品| 哑洲在线| 你操综合| AA级电影三区| 97在线播放| 五月色综合| JIZZJIZZ亚洲女人被躁| 西西美女视频网| 精品国产一区二区三区四区在线看| 热久久国产精品视频大陆精品| 欧美天天| 亚洲欧美91| 1769国内精品视频| 熟女网站最新| 五月丁香色综合| 亚洲综合20p| 操人妻逼91| AAAAAAAAA黄片| 97美日韩视频| 少妇诱惑视频| 黄色免费网| 嗯嗯啊啊日韩精品| 操操AV电影| 隔壁邻居波多野结衣中文字幕 | 超碰免费人妻人人| 久久这里| 五月激情综合网| 18禁看网站一区| 风月影院男女十八禁| 99热这里是精品| 自拍内地三级在线观看| 欧美激情 一区| 啊啊啊啊啊啊在线看| 中文字幕一区电影在线观看| julia国产在线 | 操逼视频免费日韩无码| 欧美精品97| 亚州中文字幕超碰97| 日本天天色| 岛国激情视频在线观看| 懂色AV网| 天堂国产AV| 亚洲天堂无码| 激情黄色片在线观看| 国产农村妇女毛片精品久久| 日本一区99| 大香蕉伊人色偷偷在线| 综合久久六月久久婷婷| 大香蕉免费3| 久久久久久久久久久久97| 躁躁日曰躁2020| 激情五月婷婷| 亚洲欧美综合区自拍另类 | 中文字幕 人妻不满 在线视频| www.av在线视频| 91熟女视频| 亚欧美综合网| 超碰69| 亚洲区限制级| 超碰超碰95| 成人免费不卡在线视频| www.亚洲黄色| 香蕉99秘 一区精品蜜桃臀| 亚洲凸凹超碰成人| 情色av电影| 女色视频社区| 欧美性爱在线无码| 美女尤物人人操| 在线午夜成人无码视频| 色区97| 干B| 一区麻豆 高清中文字幕| 99999无码| 亚洲激情综合| 人妻少妇精品一区二区三区| 在线看免费无码AV天堂的| 亚洲av影院在线观看| 国产91av在线播放| 免费国产视频| 色综合加勒比| 欧洲亚洲天堂精品| 97公开久久| 偷窥自拍亚洲色图| 亚洲AV无码天美传媒一区| 日本操嫩b网| ss久久| 东京热亚洲一区二区| 黄片无码在线制服| 91c色| 黄片直播三级黄片两女一男| 亚洲天堂7777| 精品少妇一区二区三区在线视频| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 亚州精品人妻一二三区| 天欧美在线| 91色综合色| 一区二区亚州激情久婷婷欧美| 五月丁香综合激情| 日本污ww视频网站| 秋霞影音一区二区三区| 国产粉嫩蜜臀av一区二区三区| 亚洲色91C| 天天舔天天日天天射| 青青伊人久久| 麻豆a'v电影| 歐美性天天| 久久视网78| 懂色AV一区二区三区| 日本熟妇熟色97一本在线观看| 久综合网| 抽查国产福利主播| 超碰亚洲97| 性生活无遮挡纯毛片在线看| 熟女高潮合集-永久久久-成人AV| 久久久96精品| 国产熟女高潮一区二区三区| 情色图区| 玖玖久久久| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 大色网久久| 日本人妻中文字幕| 天天色欧美| 国产又粗又大硬免费色网视频| 亚洲人妻中文在线视频| 日韩精品在线观看观看| 精品在线观看视频在线| 99亚洲天堂| 五月激情小说| n1038 一二三区| 97国产精选| 99热| 国产精品久久久久久 百度| 亚洲第一无码播放立川理惠| 欧美日韩国产中文超碰| 一区二区三区四区姦女| 久久6热精品99视频| 亚洲AV永久无码精品成人调教| 好属操| 婷婷中文网| 91亚洲不卡一区| 久久久久久中文| 国产偷拍网站| 国产九九九九九九九九| 人妻天天操天天爽视频免费| 最新精品久久蜜桃| 哈哈操电影| 黄色性爱网网| 不卡码视频| 日韩九九九| 超碰在线观看av不卡| 欧美九九爱| 国产女主播视频在线观看| 91色图| 亚洲精品一区二区三区在线播放| 天天流夜夜操| 青青草原香蕉日本Ap| 97亚洲中文| 国产精品视频精品一二| 亚洲射综合网| 久久日韩肥臀| 熟女乱伦A| 国产四虎在线| 亚洲成人帖图| 成人97人人超碰人人| 五月天伊人| 色九九综合AV| 黄色片A级一区二区三区| 成人短视频在线观看| 精品.99999| 欧色网址| 国产浮力影院第1页| 欧美少妇性乱| 在线午夜成人无码视频| 午夜丁香婷婷| 熟女露脸激情自拍视频| 五月天我淫我色av| 一区二区你上我| 久久欧美激情| 亚洲免费人妻在| 91n免费处女| 97在线免费看视频| 婷婷亚洲综合| 日韩熟女视频二区| 亚洲精品一二区| 老女人碰碰在线碰碰视频| 色哟哟 日韩精品| 亚洲AV乱码专区国产噜噜亚洲| 国产又粗又长又大的视频| 亚洲熟女中文字幕在线| 久久久久久99999国产精品| 国产传媒操逼视频| 自拍视频大全亚洲专媒视频/一区二区三区 | 被男人吃奶很爽的毛片| 亚洲色堂免费视频| 久久女人| 日韩情色视频| 香蕉欧美| 久久蜜桃综合网| 1769国内精品视频| 免费网站观看www在线观| 九九九色| 亚洲国产天堂| 五月丁香综合啪啪| 国产搭汕a级片| 天天综合网国产| 麻豆久久精品亚洲精品88| 超碰97资源大奶| 国产精品美女久久久久AⅤ国产馆| 久久深夜无码| 男人高清无码一区二区| 欧美亚州色的图| 国产免费永久精品无码| 欧美三四五区| 亚洲成人综合在线| 久久久久9999| 亚洲国产一级中文综合久久天堂在线免费观看| 99无码狠狠久久| 日本伦理一区二区| 操www| 97超碰精品成| 六月婷婷色综合| 草草草草视频| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 99热综合在线| 精品无码一区二区三区| 91久久国产综合精品| 男人a天堂手机在线版| 91色欧美| 久久精彩视频9| 国产精品亚洲高清在线| 久久男人| 91蜜臀在线久久久久| 欧美另类精品xxxx| 97操97干| 天天插天天舔舔天天干| 久干9操| 桑老女人九区| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 中文字幕精品日韩中文字幕| 天操天操夜操夜月操月年年操操| 无遮挡猛进视频免费无限观看 | 99国产精品人妻人伦| 中文字幕日韩人妻视频| 亚洲黄色电影| 欧美色图偷拍另类| 操人91| 国产成人拍国产亚洲精品| 成人天天爽| 亚洲中文字幕有码视频一区二区三区| 亚洲欧美999| 色香综合天天影视综合| xxx亚洲午夜天堂| 可以在线观看AV的网站| 欧美亚洲情色| 91伊人久久在线| 亚洲91少妇| 熟女五十路一区二区三| 96精品久久久久久久久久| 91精品婷婷国产综合久久竹菊| 日本岛国黄色网址| 人干人人人操人人摸| 美女网站91| 91激情国产| 日韩天天本| 九九热免费国产视频婷婷伊人| 五月天黄色激情视频| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 97蜜桃综合| 久久久久久AⅤ无码免费肉站| 九热中文字幕| 破处bbq| 东北女人被操| 色色色综合| 欧美刺激色黄片免费看| 手机看片91人妻| 男人天堂新| 亚州国产成人精品女人久久| 婷婷三区| 久操B网| 中文字幕在线播放2中文字幕在线观看2| 久久中文字幕不卡人妻| 久久东京热久久| 日韩成人小视频| 97视频www| AV丝袜少妇| 老熟女91av| av中文在线| 丁香婷婷久久 | 五十路熟女人妻一区二区三区四区五| 久久是精品| 无码久| 热热热热日日漂亮永久永久国产日| 日本三级日本三级三级人妇四虎| 无码伊人久久大杳蕉中文无码| 亚洲成人无码影院| 日韩操逼HD| 亚欧成人一级片在线播放| 亚洲 欧美 第一页| 日韩人人精品| 亚洲成人精品久久久| 啊啊啊啊视频免费| 麻豆区99999| 狠狠干综合| 麻豆这里只有精品| 99热这里是精品| 五月天激情小说| 日韩AC| 日本三级大片| 欧美亚洲性爱一区二区| 久久綜合很很很| 97超碰色五月| 久久av一级av少妇av高潮 | 日日日大屁股骚女人精品| surenchaopeng| 97色欧州| 亚洲精品欧洲精品| 日韩78m视频| 亚洲成人一二三区| 久热精品色情| 国产视频小说| 97超碰超欧美。| 黄久久| 综合 亚洲 欧美| 国产区在线| 人人妻人人玩人人澡人人爽| 9久久久久久| 天天操天天舔| 熟妇一区,二区,三区。| 97精品久久久久中文字幕| 亚洲日本天堂| 老司机福利社视频在线观看| 欧美日本不卡在线| 啊啊啊啊啊啊好多水| 精品九九九九九九| 国模无码人体一区二区三| 亚洲va有码在线天堂| 亚欧成人一级片在线播放| 欧美97| 欧美性爱中文字幕无线码| 中文字幕99999| 午夜男女爽爽爽影院视频| 激情综合二| 高清国产av无码| 日韩97超碰中文字幕| 男人 天堂 日 亚洲| 夜夜操一区二区| 97欧美久久久久久久| 天天伊人| 国产精品久久久无码aV去| 伦伦成年午夜免费视频| 天天综合精品|