日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

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í)下載說(shuō)明其在MFC網(wǎng)絡(luò)編程練習(xí)場(chǎng)景中具有一定參考價(jià)值。代碼圍繞CSocket對(duì)象的使用展開(kāi)覆蓋Winsock初始化、服務(wù)器綁定監(jiān)聽(tīng)與接受連接、客戶端連接服務(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)試說(shuō)起這套 MFC TCP 程序到底解決什么問(wèn)題把 MFC、TCP、Socket 三個(gè)詞湊進(jìn)同一個(gè)工程真正卡人的往往不是 API 名字記不住而是 MFC 的消息循環(huán)、線程模型和窗口生命周期怎么跟網(wǎng)絡(luò)收發(fā)共存。這套 C/S 架構(gòu)程序把服務(wù)端監(jiān)聽(tīng)、客戶端連接、消息收發(fā)、日志顯示拆成幾個(gè)職責(zé)清晰的類用 CAsyncSocket 的異步事件模型驅(qū)動(dòng)收發(fā)適合做局域網(wǎng)聊天、設(shè)備指令下發(fā)、上位機(jī)通信這類小體量工具的原型也適合剛接觸網(wǎng)絡(luò)編程、想看清一次連接從建立到斷開(kāi)完整鏈路的開(kāi)發(fā)者。它不追求高并發(fā)指標(biāo)追求的是結(jié)構(gòu)清楚、每一步都能打斷點(diǎn)看明白。2. 工程結(jié)構(gòu)與選型先定 CAsyncSocket 和 CSocket 的邊界動(dòng)手寫代碼之前工程怎么切分、用哪套 socket 封裝比后面寫多少行都關(guān)鍵。很多人一上來(lái)就把CAsyncSocket塞進(jìn)對(duì)話框類里結(jié)果一個(gè)OnReceive里既有界面刷新又有協(xié)議解析改到第三個(gè)功能就再也理不清了。2.1 一份可以直接編譯的雙工程目錄這個(gè)項(xiàng)目按“共享協(xié)議 服務(wù)端 客戶端”三塊切Common放兩端都要用的頭文件Server和Client各是一個(gè)獨(dú)立的 MFC 對(duì)話框工程編出來(lái)的兩個(gè) exe 可以分別跑在兩臺(tái)機(jī)器上也可以在同一臺(tái)機(jī)器上開(kāi)兩個(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ì)列里撈出來(lái)后者是“一線工人”一個(gè)實(shí)例對(duì)應(yīng)一條 TCP 連接負(fù)責(zé)這條鏈路上的全部讀寫和異常處理。把這兩件事拆開(kāi)后面加“最大連接數(shù)限制”“IP 黑名單”才有地方插。ServerDlg只做三件事接按鈕、寫日志、維護(hù)在線列表。它不直接持有 socket 的讀寫邏輯所有網(wǎng)絡(luò)事件通過(guò)自定義窗口消息回到這里這樣界面線程永遠(yuǎn)不會(huì)被阻塞。類基類職責(zé)生命周期CListenSocketCAsyncSocket監(jiān)聽(tīng)端口處理 OnAccept與主對(duì)話框同壽CClientSocketCAsyncSocket單連接收發(fā)、切包、斷線檢測(cè)連接建立時(shí) new連接關(guān)閉后 deleteCServerDlgCDialogExUI、日志、連接表托管整個(gè)進(jìn)程PacketBuffer無(wú)自寫粘包拆包歸屬 CClientSocket2.2 三種寫法怎么選原生 Winsock、CAsyncSocket、CSocket原生 Winsock 最透明WSAStartup、socket、bind、listen、select全部自己管代價(jià)是事件分發(fā)要手寫一個(gè)select循環(huán)套著幾十行FD_ISSET判斷新手很容易在錯(cuò)誤處理上栽跟頭。CAsyncSocket是 MFC 對(duì) Winsock 的薄封裝底層通過(guò)異步窗口消息把FD_ACCEPT、FD_READ、FD_WRITE、FD_CLOSE轉(zhuǎn)成虛函數(shù)回調(diào)也就是常說(shuō)的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ù)沒(méi)有一一對(duì)應(yīng)關(guān)系半包一來(lái)就拋異常而且異常棧往往看不出真正原因。這個(gè)項(xiàng)目選CAsyncSocket理由很實(shí)際協(xié)議體就是二進(jìn)制塊和字符串沒(méi)有復(fù)雜的對(duì)象序列化需求異步回調(diào)配上自己維護(hù)的收包緩沖區(qū)控制權(quán)在我手里。常見(jiàn)做法是——消息頻率低、協(xié)議簡(jiǎn)單CAsyncSocket足夠真要傳大文件、需要做背壓控制反過(guò)來(lái)用獨(dú)立工作線程加阻塞 socket把收發(fā)和 UI 徹底隔離反而更省心。3. 服務(wù)端拆解監(jiān)聽(tīng)、accept 和多連接托管服務(wù)端是整條鏈路的起點(diǎn)它出問(wèn)題的表現(xiàn)往往很隱蔽——客戶端那邊只看到“連接被拒絕”或者“連上三秒就斷”真正的原因藏在服務(wù)端的初始化順序和對(duì)象生命周期里。3.1 初始化和監(jiān)聽(tīng)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è)沒(méi)有窗口的循環(huán)里任務(wù)管理器里看著像僵尸進(jìn)程。真正開(kāi)始監(jiān)聽(tīng)的動(dòng)作放在對(duì)話框的按鈕響應(yīng)里方便反復(fù)啟停// ServerDlg.cpp —— “開(kāi)始監(jiān)聽(tīng)”按鈕 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)聽(tīng)套接字失敗錯(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 端口開(kāi)始監(jiān)聽(tīng)), m_nPort); GetDlgItem(IDC_BTN_LISTEN)-EnableWindow(FALSE); }Create的第一個(gè)參數(shù)是端口傳 0 會(huì)讓系統(tǒng)隨機(jī)分配一個(gè)可用端口這在做多實(shí)例自測(cè)時(shí)很有用通過(guò)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í)際上它只影響“三次握手完成但還沒(méi)被 accept 取走”的連接能排多長(zhǎng)隊(duì)。這個(gè)值一般給 5 到 10 就夠局域網(wǎng)工具用。GetLastError返回 10048 是端口被占用八成是上一次調(diào)試時(shí)進(jìn)程沒(méi)退干凈返回 10013 是權(quán)限不夠通常是端口號(hào)小于 1024。3.2 OnAccept一次事件里把隊(duì)列收干凈CAsyncSocket的OnAccept是邊沿觸發(fā)式的通知——內(nèi)核告訴你“有連接進(jìn)來(lái)了”但不會(huì)告訴你“有幾個(gè)”。如果回調(diào)里只Accept一次而恰好同一瞬間來(lái)了三個(gè)客戶端剩下的兩個(gè)就會(huì)一直躺在隊(duì)列里直到下一次有新連接觸發(fā)事件才被順手取走。表現(xiàn)出來(lái)就是“客戶端連上了但服務(wù)端列表里沒(méi)有”或者“第二個(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ì)列里沒(méi)有待處理連接 for (;;) { CClientSocket* pClient new CClientSocket(m_pDlg); if (!Accept(*pClient)) // 失敗說(shuō)明隊(duì)列空了或者出錯(cuò) { delete pClient; // 這里必須回收否則每來(lái)一次事件泄漏一個(gè)對(duì)象 break; } m_pDlg-AddClient(pClient); // 交給主對(duì)話框托管進(jìn)入在線列表 } CAsyncSocket::OnAccept(nErrorCode); }Accept的第一個(gè)參數(shù)是“用來(lái)承載新連接的CAsyncSocket對(duì)象”所以必須在調(diào)用前 new 出來(lái)。失敗時(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ì)象托管和銷毀誰(shuí) new 誰(shuí) 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)返回后訪問(wèn)已釋放內(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分開(kāi)寫順序反了會(huì)導(dǎo)致CAsyncSocket析構(gòu)時(shí)去關(guān)一個(gè)已失效的句柄調(diào)試版會(huì)彈斷言。4. 收發(fā)層拆解粘包、半包和跨線程回 UITCP 是字節(jié)流不是消息流。這條常識(shí)誰(shuí)都背得出但真寫起來(lái)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用來(lái)快速判斷是不是自己的協(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é)沒(méi)問(wèn)題但只要以后加一個(gè)UINT8字段編譯器就會(huì)補(bǔ) 3 個(gè)填充字節(jié)兩端算出來(lái)的sizeof不一致切包直接錯(cuò)位而且錯(cuò)得很隨機(jī)——改了結(jié)構(gòu)體的人自己測(cè)沒(méi)事別人拉下來(lái)就崩。length字段走網(wǎng)絡(luò)字節(jié)序發(fā)送前htonl收到后ntohl。x86 是小端兩端都是 Windows 時(shí)看著“不轉(zhuǎn)也能跑”一旦以后接個(gè) ARM 板子或者用別的語(yǔ)言寫客戶端立刻翻車。這個(gè)轉(zhuǎn)換成本幾乎為零沒(méi)有理由省。4.2 OnReceive 里循環(huán)讀到 WSAEWOULDBLOCKOnReceive同樣是“有數(shù)據(jù)了”的邊沿通知一次回調(diào)里內(nèi)核緩沖區(qū)可能已經(jīng)堆了好幾 KB。只Receive一次的話剩下的數(shù)據(jù)要等下一次事件而如果對(duì)端就發(fā)了這一批然后不說(shuō)話剩下的字節(jié)會(huì)一直卡著表現(xiàn)成“消息只收到一半就沒(méi)了”。// 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í)沒(méi)數(shù)據(jù)了”屬于正常n 0是 FIN 包對(duì)端主動(dòng)關(guān)了其他錯(cuò)誤碼才是真異常比如 10054 是連接被對(duì)端重置。ParseBuffer負(fù)責(zé)把緩沖區(qū)里的字節(jié)按包頭切開(kāi)// 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的合法性檢查看起來(lái)多余實(shí)際上是一條防線如果對(duì)端發(fā)來(lái)一個(gè)聲稱 4GB 長(zhǎng)度的包頭沒(méi)有這行判斷后面的GetSize() total永遠(yuǎn)為真緩沖區(qū)會(huì)一路漲到內(nèi)存爆掉而日志里什么都不會(huì)打印屬于典型的黑匣子問(wèn)題。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ā)送成功是這類程序最常見(jiàn)的隱性 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)來(lái)發(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)來(lái)了再繼續(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; // 誰(shuí)接收誰(shuí)釋放 return 0; }堆對(duì)象是必須的PostMessage是異步的如果用棧對(duì)象地址消息還沒(méi)被處理函數(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)回來(lái)再顯示兩端一致就行最怕的是一端用CStringA一端用CStringW。5. 避坑與排查MFC Socket 最容易出問(wèn)題的四個(gè)位置這一節(jié)的現(xiàn)象都是我在調(diào)試這套結(jié)構(gòu)時(shí)真實(shí)撞過(guò)的順序按“從啟動(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)不來(lái)——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掉重來(lái)。現(xiàn)象二服務(wù)端顯示監(jiān)聽(tīng)成功客戶端就是連不上錯(cuò)誤碼 10061。原因Windows 防火墻攔了。第一次運(yùn)行編出來(lái)的 exe系統(tǒng)會(huì)彈一個(gè)“是否允許訪問(wèn)網(wǎng)絡(luò)”的框如果當(dāng)時(shí)點(diǎn)了取消之后這個(gè)程序的所有入站連接都會(huì)被靜默丟棄而且不會(huì)再?gòu)椀诙?。解決到防火墻的“允許應(yīng)用通過(guò)”里把這個(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è)能把“防火墻問(wèn)題”和“代碼問(wèn)題”分開(kāi)。綁定地址用INADDR_ANY而不是127.0.0.1后者只接受本機(jī)連接別的機(jī)器連過(guò)來(lái)會(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è)常見(jiàn)原因是直接用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的注釋里誰(shuí)改誰(shuí)負(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)度別憑感覺(jué)寫常量。調(diào)試期在ParseBuffer里加一行日志打印緩沖區(qū)當(dāng)前長(zhǎng)度和切出來(lái)的包長(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)聽(tīng)前給 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)聽(tīng)同一端口。真正同時(shí)監(jiān)聽(tīng)要靠SO_REUSEPORTWindows 上的語(yǔ)義和 Linux 不一致跨平臺(tái)項(xiàng)目別指望它。另外退出時(shí)記得按“先Close所有連接再Close監(jiān)聽(tīng)最后讓CWinApp正常返回”的順序收尾。漏掉某一步的表現(xiàn)是進(jìn)程在任務(wù)管理器里掛著不退下一次調(diào)試端口還是占著。6. 二次開(kāi)發(fā)把它改成一個(gè)真能干活的工具這套骨架跑通之后改造成本主要花在三個(gè)地方按投入產(chǎn)出比排。第一是加心跳和超時(shí)踢人。協(xié)議里已經(jīng)留了MSG_HEART服務(wù)端維護(hù)一個(gè)mapSOCKET, time_t起一個(gè)SetTimer每 30 秒掃一遍超過(guò) 90 秒沒(méi)更新的連接直接Close并從在線列表移除。沒(méi)有這一步客戶端拔網(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)位置大致工作量解決的問(wèn)題心跳超時(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)輸入跑過(guò)一遍基本就敢往設(shè)備上掛了。從那以后我每次寫這類帶網(wǎng)絡(luò)的小工具都會(huì)先把“發(fā)包不完整、收包不完整、連接突然消失”這三件事的日志打點(diǎn)加進(jìn)第一版而不是等出問(wèn)題了再回來(lái)補(bǔ)。調(diào)試網(wǎng)絡(luò)問(wèn)題最貴的是信息日志里多一行緩沖區(qū)長(zhǎng)度可能省掉一整晚。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
黄色高清无码无码破解免费暗网| 亚州色交| 日韩人妻精品中文字幕| 蜜臀在线视频| 激情综合五月天| 一区二区三区精品黑丝白丝酒店对鸡 | GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 色噜噜人妻丝袜a∨先锋影| 婷婷在线精品| 中文字幕午夜精品久久久| 尹人免费观看视频在线| 西西美女视频网| 日韩熟女精一区二区三区不卡| 一区二区三区免费岛国片| 日韩紧密久久| 最新日本中文字幕| 920日本午夜免费| 亚洲人妻久久久| 精品无码欧美三级| 日本久操视频| 久久精品福利影院| 男人的天堂.com| 殴美色网| 久久99视频| 91精品婷婷国产综合久久竹菊| 久久久久久99AV无码免费网站| 玖草在线视频| A级片日韩欧美国产欧美视频精选观看 | 夜夜青青无码影院| 成人免费在线网站| com 首页 18岁 禁区 女优 免费 精选 同城 | 欧美 亚洲 另类 综合| 蜜臀一区二区三区在线| 97亚洲综合电影| 激情婷婷黑人91| 成人免费福利在线观看| 午夜AV污污污| 麻豆蜜桃视频在线观看 | 黄色十八禁网站| 另类图片欧美激情综合| 色爽——AV| 免费一级毛片在线视频观看| 久久婷婷苹果| 婷婷丁香五月激情啪啪| 97天堂| 国产亚洲 中文欧美久久| 超碰97丝袜| 久久极品一区二区| 一级成人性爱| 91在线丝袜视频| 26uuu国产日韩综合在线观看| 18岁禁 茉莉成人久久| 国产福利电影| 久久久久久久9最新免费视频观看| 亚洲中文一区二区三区| 啊啊啊操死我了| 99久久久久| 91网亚洲| 乱伦系列一区二区| 校园春色五月天| 亚洲欧美性生活| 激情五月天插| 国产夫妻性生活视频| 六月婷婷综合| 日本孕妇一区二区视频操逼免费看 | 亚洲综合色网| 亲子敌伦对白在线播放| 午夜福利一区二区三区四区五区色婷婷| 日本理论在线| JIZZJIZZ亚洲女人被躁| 久久久96| 99精品在线| 91精品91久久久中77777| 久久只有精品| 激情四射五月天| 中文字幕一区av| 一区二区三区美女超清| 久久99久久99精品天美传媒棢·纸:. | 久久精品99| 亚州精人品大香蕉| 久久99视频| 性爱视频无打码在线观看| 欧美亚州综合网图片| 免费人人搞97| 午夜精品探花| 久久男人精品| 日韩精品在线放| 欧美一区二区三区成人性生活| 精品国产片亚洲一区| 中国一级操逼视频| 蜜桃av色偷偷av老熟女| 久7色| 亚洲高清国产理伦片| 国产9区| 麻豆91熟妇人妻中文字幕茄子| 97 九色| www.久久| 中国一区二区亚洲人妻| 人妻 中文 日韩| 大香蕉啪啪啪| 欧美中文字幕日韩在线| 97视频免费在线观看| 无码九九| 青草精品视频一日本久久久久网站| 久久精品视频在线观看| 草b在线 | 色久桃花影院在线观看| 91性网| 日本加勒比无码专区一二三| 麻豆乱码久久精| AV天天在线观看| 国产兽交视频在线播放| 人人性爱视频免费| 欧美精品成人一区二区在线观看 | 天天操综合网| 思思热免费在线视频| 日本一级特级毛片视频| 欧美天天性| 精品人妻一区二区三区免费视频| 天天狠| 岛国黄色大片网站| 一区二区视频在线播放| 精品国产久热在线观看| 多乙久久久久久| 久久久免费的精品| 蜜乳性色无码专日粉嫩骚逼AV| 国产精品网址| 国产高清精品一区二区三区毛片| 五月丁香黄色网| 亚洲黑人在线| 无遮挡又黄又刺激的视频| av毛片aaaaa免费看| 91天天综合| 欧美色乱| 亚洲?V无码专区在线电影| 成年人网站在线免费观看| 欧美色网| 成人黑料社久久| 久久一区二区三区入口| 丁香五月激情综合国产| 亚洲不卡AV在线| 97色色网| 4141514逼喷水三级片| 99视频只有精品| 日韩另类色图| 青青草视频导航官网| 亚洲欧美激情小说| 97干在线| 国产女人和拘做爰视频 | 国产精品久久久久av| 久久香蕉综合一本到3atv| a v网站在线播放| 国产高清成人传媒影视| 日韩中文字幕熟妇人妻| 亚洲激情深爱文学小说网站| 亚洲 欧美综合| 亚洲人妻爽爽爽| 婷婷午夜清品久久久久久久性色视频观| 91精品91久久久中77777| 高清视频一区| 影音先锋视频在线| 禁止观看美女黄| 欧美在线啊啊啊| 玖玖无码超碰| 中字幕人妻一区二区三区| 日本国产高清色www视频在线| 精品少妇人妻av久久免费| 蜜桃无码AV一区二区| 天天操夜夜操| silk lablo在线观看一区二区| 亚洲综合影片| 天堂成人网| se吧提供国产乱老熟视频胖女人| 久久天天摸| 久久亚洲天堂| a片久久久久久久久久久久 | 农村少妇久久久久久久| 国产av又色又爽又黄| 日本三级日本三级99| 夜嗨影院| 99国产精品久久久久久久成人热| 欧美性色欧美| 狠狠中文字幕| 欧美日韩亚洲少妇寂寞影院正在播放 | 白 大 人妻 区 在线| 8050无码八戒| 欧美制服另类丝袜| 久久一二三四五六七八九区| 一本精品日本在线视频精品| 伊人亚洲国产一成人久久精品,久久| 狠狠躁AV| 国产精品久久泡妞网站| 极品白嫩美女白浆成人福利在线看| 日韩草久视频| 一区二区三区 丝袜高跟| 97欧美综合| 久久久久久AⅤ无码免费肉站| 国产视频一区二区在线观看| 欧美亚洲天堂| 亚洲色图欧美色图制服丝袜| 欧亚日韩一区在线| 天天插天天插| 欧美高清16| 凹凸视频特色日本特黄| 91精品国产长腿丝袜美女| 日本道久久综合色色| 日本阿v天堂在线观看| 国内偷自视频区视频综合| 三级日韩一区二区三区| 精品人妻二区三区| 久久久久久久97| 综合激情婷婷| 素人伊尹大香蕉免费下载视频| 97超碰人人模人人拍人人| 综合激情五月天| 99热欧美| 国产玖玖| 五月天亚洲色图| 丁香六月激情综合| 五十路三区在线| 天天欧美欧美亚洲网| 午夜精品久久久久久久久久久久久| 99日精品欧美国产| 少妇被c 黄 免费观看| 99国产精品人妻人伦| 五十路熟女人妻一区二区在线观看 | www鬼畜国产男人的天堂| 思思热国产高清| 亚洲另类久操网| 久久久性| 91激情国产| 色就色综合| 日韩一级二级三级免费看完整版国语版| 思思热在线视频免费| 国产日韩人人| 26uuu欧美| 国产精品操| 屌妞视频久久久久久久久久久久| 99久久精品国产高潮| 91熟女网| 日韩电影天堂视频一区二区| 婷婷丁香成人| 2023天天操夜夜操| 日韩电影免费网站麻豆视频| 欧美极品女人的天堂| 亚洲一区操| 人妻天天爽夜夜爽2| 人人天天欧洲| 日本性爱网址| 国产精品成久久久久午夜午夜| 夜夜爽爽夜夜精品视频| 丝袜熟女2P| 啪啪资源网| 老熟女天天操| 嗯嗯啊啊好大好爽| 亚洲 图片 综合91| 五月丁香| 国产超碰| 一区操逼日比视频| 亚洲综合第一页| 日韩av电影网站| 久7色| 欧美一区二区三区另类精品| 亚洲色图欧洲| 精品少妇人妻一区二区三区| 欧美永久激情一区二区| 青青草在线视频人人想人人上| 丰满少妇乱子伦精品无| 欧美1区二区三区公司 | 亚拍在线| 亚91亚洲网| 久久久久9999| 中文字幕123| 中文字幕第9页萱萱影音先锋| 婷婷五月天色网| 蜜屁Av| 无码一区二区三区四区五区六区七区八区九区十区视频 | 黄色AAAAA欧美| 艳美熟妇先锋一二三区| 人妻一区二区三区四区视频| 超碰在线免费一区二区三区| 亚洲丰满很很操| 色欲人妻一区二区在线| 久久九九一区二区三区成人| 亚洲最大黄网| 欧美色图天堂在线| 久久五月丁香| 丁香婷婷色五月| 午夜影美女日鸡鸡天天视频国产| 成人精品一区二区91毛片不卡| 久久精品一区二区三区四区五区| 久久久精精精| 亚洲 欧美综合| 密臀成人视频久久久| 亚洲日韩东京热一区| 男人的天堂色偷偷青青草视频婷婷网| 久久精品视频久久久| 亚洲午夜免费狠狠干| 九九热超碰| 色情五月丁香| 中文字幕艹艹| 久久男人网| 亚洲欧美另类少妇精品| 69精品人人人人| 国产60区。| 亚洲日韩青青草色月| 欧美色九九九| 超碰人妻中文在线| 色男人色天堂东京热| 日韩精品人妻中文字有码在线| 久久综合女优| 91男人天堂网| 九九九九九九免费视频| 久久一区二区蜜桃| 乱操乱伦AV| 亚洲无码国产探花在线观看| 2018天天干在线视频| 亚洲国产精品成人无码久久久| 免费伦费视频在线观看| 国内三级自拍小视频在线观看 | 夜夜欢天天干| 富女玩鸭子一级毛片| 亚洲欧洲av影音| 嫩呦国产一区二区三区AV| 人人操人人操人人人操| 亚洲AV永久无码一区仙野| 99精品久久| 日韩成人色图| 人妻少妇三级| 中文不卡视频| A片大香蕉在线| www.大香| 欧美精品在线观看| 91久久堂| 91 丝袜在线播放| 天天激情综合站| 国产精品久久久久久久黄无码 | 中文字幕一区二区三区字幕| 亚州AV无码国产精品| 五月婷婷激情综合| 极品内射| 九九精品网| 51国产午夜精品视频| 一区二区视频在线播放| 久99久视频精选| 一区二区视频你懂的| 蜜汁欧美| 色色色色日本| 啊啊啊啊嗯嗯嗯用力好爽 | 激情小说激情视频| 97人人操人人摸| 五月天偷拍| 97精品综合久久网| 日韩综合色图| 大香蕉五月天婷婷| 亚洲第91页| 男人的天堂2019| 在线看片国产精品每日更新| 偷拍网站久久男女男| 9999九九九久久久| 久久久久九九九| 日本理论在线| 加勒比综合九九99视频在线播放| 色香av| 人人做人人妻人人夜视频| 欧美色偷拍| 日韩成人人妻网站| 日韩成人在线性爱视频| 中文字幕 一区二区 亚洲无码| 91碰碰| 欧州一区二区三区四区| 五月丁香综合网| 狠狠躁天天躁日日躁97| 日韩精品国产一区二区| 狠狠躁AV| 中文字幕乱码在线观看| 色狠狠色| 亚洲图片欧美另类综合免费视频大大香| 百度百度日本操逼| 久久香蕉国产传媒一区剧情天美| 91日日夜夜| 18禁免费视频| 色网在线| 99re公开精品免费视频| 日韩久久艹| 欧美人体性爱互联网第一页婷婷日本| 久久精品欧美一区蜜桃| 九九热国产| 中文字幕在线日亚州9| 蜜桃丰满熟妇av无码区不卡| 国产一级特黄大片处女| 久久超碰免费的| 国产在线综合网| 久久99国产综合精品女同| 一本久道久久综合狠狠爱一密臀精| 嫖老熟女A片一二三区| 一级黄碟| 99久久99九九99九九九| 欧美草草高清日韩视频| 操逼日韩无码| 久久精品电影在线| 久久国色天香香蕉| 日韩在线欧美精品一区二区| 日日AV加勒比| 人人操肉肉| 欧洲精品欧洲精品| 国产女性无套 免费观看| 人妻精品一区一区三区蜜桃91| 狠狠色狠狠色狠狠五月| 综合网亚洲1| 精品一区二区成人动漫| 97超级久久| 亚洲有薄码区日本系列中文字幕| 屁股久久久久久| 爆乳免费黄网站| 亚洲欧洲中文日韩女优乱码| 国产精品丝袜久久亚洲不卡| 亚洲色 国产 欧美 日韩| 九九热午夜欧亚国产视频| 噜噜噜无码AV一级一级久久影院| 久久久久久九九九| 一区二区三区四区久久视1| 激情网色| 国产精品播放| 亚洲熟久久| 国产av白丝| 91在线无码精品秘 软件| 99日视频在线免费| 少妇二级| 人妻丰满熟妇一区二区三| 久久同城AV| www99热| 少妇久久久久久| 96免费视频在线| 国产精品无码在线| 激情欧美97| 欧美综合制服在线| 资源在线观一 二| 国内精品久久人妻性色av| 国产精品电| 五月天黄色av| 国产视频一区二区免费| 亚洲一区操| 欧美第五页| 韩国轻伦国内自拍一区| 国产精品国产拍高清AV| 亚洲中文字幕精品一区| 中文字幕精品亚洲熟女| 欲色影视综合吧| 日韩人妻一区二区精品| 91人妻最真实刺激绿帽| 欧美激情精品| 亚洲色图第一页| 黑人天8A∨高清网站| 中文字幕在线高清男人的天堂 | 欧美一区二区亚洲天堂| 丝袜足交视频| 人澡逼| 一级久久久久久久久久久| 熟女人妻一区二区三区| 国产精品人妻免费精品| 亚洲毛片久久| 亚洲骚男同com| 加勒比AV网| 淫妻综合网| 久久久久国产精品喷潮免费观看臀 | 偷拍在线观看视频| 精品福利视频| 91一区二区| 999国产精品999| 五月婷婷六月丁香网址| 蜜乳成人AV| 天天综合~91| 黄页av| 男人天堂导航| 蜜桃午夜视频一区二区| 免费观看网黄| 又粗又长又大国产不卡| 91人妻人人澡人人爽人人精品| 亚洲九九爱| 国产精品第二页| 9超碰免费| 丁香五月天婷婷姐| 九九久久久九九| 欧亚综合一卡二卡中文字幕| 精品久久視頻在线| 欧美精品四区| 999在线电影香蕉| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 久久久久久久久久久999| 欧美狠狠操| 中文字幕乱碼在线| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 黄色免费一级在线毛片| 无码高清操逼| 一区二区三区亚洲| 久久五十路熟女人妻| 秋霞成人一级在线观看| 欧美日韩国产三级黄色| 你想操日本小逼吗| 亚欧无码在线| 日本日皮视频逼| 日韩人妻一区二区精品| 欧美激情五月天| 亚洲男人的天堂亚洲| 天天色综合图片| 99r九九| 搞中出视频在线观看| 日日A∨| 天天操天天谢| 人妻熟女一区二区三区视频| 亚洲欧美另类图片| 囯戸精品高潮呻吟旡码| 操逼1区| 2020国产精品| 久久婷婷国产一区二区色| 色好看av| 超碰在线1234区| 五月天伊人网| 国产精品探花色| h无码动漫在线观看| 99久久99久久综合| 91夜色chaopeng| 狠狠躁天天躁日日躁97| 女优大全 - 91n| 夜夜草天天| 丰满人妻av一区二区三区| 夂久色| 91亚洲欧美色图| 九九这里只有精品| 午夜舔阴达高潮视频免费看| 91社区拍啪人妻| 99在线精品观看99| 先锋音影AV| 精品无码少妇| 天天操天天干一区二区 | 五月天色图影视| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日韩97| 中日韩久久久| 色香阁在线| 欧美日韩美女精品久草一区二区三区 | 偷窥自拍亚洲色图| 伊人在线大香蕉视频久久| 91亚洲电影| 国产熟女免费观看久久| 91黑丝少妇| 97人人夜| 强奸乱伦Av网| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚洲无线码一区国产欧美国| 78久久久| 91精片| 91人妻尻屄视频| 日韩三级在线观看mp4| 婷婷激情丁香| 成人免费福利在线观看| 白丝少妇一区二区| 2021国产成人精品久久| 激情综合网五月婷婷| 2019天天操天天爽天天拍| 日韩15p| 韩国黄色片精品久久久| 国产第11页| 超碰免费人妻人人| 亚洲日韩AV视色| 欧美一区二区| 成人性爱电影一区二区| 国产吹潮女在线观看| 91久久免费视频互動交流| 大香交伊人网| 色色九区| AV九九| 亚洲AV永久无码精品成人调教| 精品人妻av在线播放| 老熟女熟妇| 国产精品人妻免费精品| 97在线国产精品| 色妺妺AⅤ| AA丁香综合激情| 欧美另类丝袜熟女| 婷婷五月av| 久久久久久人| 亚洲欧美国产日本一区二区三区| 97操综合| 久久久九九网站| 四虎免费在线播放| 色综合久| 久久久久久综合久久伊人蜜月| 一区在线国产播放| av天堂加勒比| 屌逼麻豆| 日日超碰亚洲| 黄色成品网站| 免费无码国产精品v片在线观看| 99RE在线视频精品,这里只有精品| 天天看天天干| 亚洲的天堂网| 色综合尤物| 夜夜高潮夜夜爽夜夜爱爱一区| 久久久97| 91人妻少妇| 91大神电影天堂| 强被迫伦姧在线观看无码网站| 久久精品视频28| 日日妻色网| 久久久性爱| 天天天天操| 日韩欧美性爱电影在线观看| 五月天综合网| 性色av网站| 精品人妻一区二区三区四区| 久久人人妻| 国产黄色影片在线观看| yazhouzaixian| 欧美视频第二页| 亚洲综合有码| 久久久久久性爱片| 免费日韩黄片| 日本97久久| 91亚州日韩高清| 超碰无码加勒比| 国产精品97超碰| 色综合一区二区三巨| 熟女乱3伦999| www久久精品| 欧美少妇熟女| 国产精品国产| 曰韩操B| 日日97| 澳门成人网站久国产日韩| 伊人在线大香蕉视频久久| A片A5445444| 成人老鸭窝人人在线视频| 高清无码一区二区三区| 国产久久视频| 亚洲免费在线探花| AV丝袜东京热| 加勒比久久综合网高清| 欧美日韩国产电影| 日本欧美韩国国产在线| 少妇内射www在线观看视频| 国产精品电影大全| 麻豆60秒| 欧美加勒比| 久jiu久神马影院| 91狠狠综合| 亚91亚洲网| 亚洲第一黄色av网站| 精品9区| 国产网红精品| 少好三P| 国模限制级电影| 视频国产精品未满十八禁止在线观看| 超碰吊日色| 天天日天天色| 亚洲一区日韩精品中文字幕 | 99999国产| 婷婷三区| 青青操狠狠撩| 超碰免费人妻在线| 少妇第一页| 大香蕉操久久| 欧美劲爆视频一区二区| 七月丁香婷婷| 少妇久久久免费| 午夜福利久久久噜久噜久久综合| 口爆吞精在线观看| 老熟女91| 美女十八禁| 性爱AV天堂| 98色网| WWW黄片COM| 一级二级三级黑人无码| 91熟女丨91老女人| 中出91视频| 日本午夜福利视频| 亚洲码专区| 亚洲欧洲中文日韩女优乱码| 欧美综合1性辶| 男人成人黄色视频在线观看免费下载| 五月天激情国产综合婷婷婷| 国产麻豆福利av在线播放| 97色碰| 国产97在线播放| 超碰社区97| 人人爽人人精品乱人伦AV| 亚洲熟妇丝袜在线观看| 亚洲欧美精品一区天堂久久| 久久九九综合| 久久草大香蕉| 婷婷五月天伊人| 99精品视频在线观看| 黄色av一区二区在线| 亚洲中文日韩精品| 秋霞蝌科网日本一区| 国产性爱在线视频一区二区| 午夜精品久久久久久久久久蜜桃 | 国内外毛片在线观看| 久久久久78| 欧美亚洲美少妇一区二区| 99综合自拍| 9长久久精品| 久久人妻少妇| 玖玖资源视频一区二区三区| 欧美少妇高潮视频| 91精品人| 国产又猛又粗又爽又黄| 午夜福利av电影在线| 男女激情黄色网址| 丁香五月激情婷婷| 国模限制级电影| 欧美青青视频| 神马久久久久久| 亚洲第2页| 久久精品视频久久久| 97视频在线视频| 性猛交| 日韩无码黄色片| 日韩精品99999| 热久久无毒不卡| 蜜臀久久99精品久久久久| 国产成人五月天丁香花| 春色综合网| 妺妺跟我一起洗澡没忍住| 婷婷亚洲天堂| 天美传媒AV国产在线| 天天肏天天干| www.国产高潮精品| 欧美在线啊啊啊| 97中文综合| 一级黄色视频网| 六九九九| 九九热精品视频六| 涩涩这里只有精品视频| 强奸少妇AV导航网| 综合亚洲网| 蜜乳性色无码专日粉嫩骚逼AV| 激情婷婷五月天| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 97视频在线播放| 中文字幕日本久久| 久久成人午夜狠狠| 伊人精品久久网站| 夜夜嗷嗷一区二区| 牛牛AV人人夜夜澡人人爽| 亚洲丝袜色| 亚洲最大的综合性av| 精品久久九| 韩国一级婬片A片无码天美| 麻豆AV一区二区| 大二网站亚洲| 久久中出在线| 天天色黄色影院天天操| 欧美亚洲日韩16色| 一级片在线观看高清无码| 黄页大片在线观看| 国产精品无码成人精品| 91总综合网| yellow网站免费观看日韩高清无码| 欧美香蕉视xxx| 变态乱伦伪娘灌肠一区二区| 老熟妇综合| 天天干夜夜操网| 久久亚洲一区二区色婷婷| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 941超碰| 天天做天天爱天天高潮| 搡老女人老91二区| 欧美一区二区三区大综合| 日韩精品黄片免费观看| 91色夜| 日韩素人无码一区二区三区三州| 看日韩黄片| 日欧毛片久久| 97天天爽| 蜜臀久久99精品久久久电影| 91欧美高清| 免费中文在线| 91天天综合网| 亚欧洲一区二区视频| 六月天婷婷| 欧美爱三级日韩久久| 国产吹潮女在线观看| 国产欧美伊人| 黄色免费网页无码| 欧美日韩97| 中国的操老妇女| 91校园春色长篇| 人妻系列无码专区中文有码| 黑人娇小av在线播放| av一区二区三区四区五区久草臀| 五月丁香黄色网| 精品一区二区2| 亚州色图第三区| 日本人妻中文字幕精品| 亚洲男人天堂2017| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 懂色AV中文| 国内精品伊人久久久久影院会| 亚洲欧美天堂| 无套后入双马尾| 亚洲天堂美臀在线| 99热aaa| 色噜噜综合在线| 日韩成人大片在线观看| 美国黄片aaa| 在线视频97| 欧美97超碰| 一二区在线观看视频| h色99999| 色超碰综合| 精品亚洲俞拍视频一区| 免费啊啊啊| 一本大道综合伊人精品热热| 青青草色插素人| 国产精品情侣啪啪| 亚洲91亚洲| 神马久久69| 欧美体内射精| 欧美91色| 亚洲情色 无码专区| 青青草好吊色| 一级人妻性爱视频| 国产精品欧美日韩久久| 欧美色五月| 四虎在线免费视频| 91中文字幕在线观看| 伊人超碰97| 国产AAAAAABBBBB| 无码操逼网| 日韩美脚一区二区网站| 欧美熟爽综合| 东北女人的毛片| 国产真实野战在线视频| 欧美人妻一区| 日本丝袜美腿人妻九九| 不卡一区视频| 骚熟女AV网| 日本爽爽爽爽爽爽免费视频| 天天色天天干天天射| 色综合久久久久| 九九九综合精品| 九九九九免费高| 欧美日韩欧美| 国产精品96久久久久久| 久久久久亚洲Aⅴ无码| 久久久一区二区三区四曲免费听| 亚洲国产一区二区三区在线 | 欧美黄色大片在线观看 | 国产白嫩精品久久| 国产av色网| 91无码西班牙视频在线| 国产精品香蕉热久久新品| 欧美亚州手机在线| 欧美综合色| 成人麻豆av电影网站| 日韩紧密久久| 日韩色| 国产女人极品高潮毛片| 亚洲色香| 欧美黄片免费在线观看视频| 曰本精品久久久| 日韩欧美大片免费高清啪啪| 欧美爆操91| 激情小说亚洲| 日本天堂网| 亚洲国产91精品一区二区久久| 啊啊啊啊二区好大| 无码操逼网| 日日摸日日弄日日拍| 久久 国产精品 一区| 78超碰| 91搡老女人老妇女老熟女歌词翻译| 色综合色色| 午夜αv| 东京热熟女亚洲视频网站| 亚洲黄色a级片| 中文字幕青青草| 加勒比在线视频| 精品毛片久久久精品毛片| 色网亚洲人| 国产超碰在线一区| 国产区性爱在线视频秋霞豆| 大香蕉综合网| 大乔未久88一区| 操操碰| 日熟女| 婷婷综合伊人一区| 亚州中文字幕超碰97| 日日夜夜狠狠| 91亚州| 日韩欧美三级| 天天α片| 青青草原人妻| 人人操av| 91久久精品中文字幕| 中文字幕久久婷婷丁香五月天| 四虎在线播放| juliaann丝袜大战黑鬼| 婷婷香蕉欧美在线一区二区三区| 日韩欧美大力操| 91超碰在线观看| 亚洲少妇免费视频\| 四虎884a| 后入内射蜜桃臀| 欧美三级免费伊人| 99re超碰| 91美女中出| 日韩美女啪啪一区| 天天草AV| 青青草亚洲一区| 九久9精品| 日本操大逼| 亚洲成a人在线观看久| 超碰在线人人射| 精品夜夜澡人妻无码AV| 欧色性第一页| 国产高清免费不卡av| 人妻夜爽夜夜爽| 亚州欧美综合| 欧洲色色| 国产九九久久久精品| 日韩久久三区| 可以免费观看的av| 精品女人999| 欧美日韩情色一区二区| 丁香激情网| 欧美在线视频99| 五月婷婷五月天| AA丁香综合激情| 日韩AV片| 性感女人网页在线观看视频| 国产欧美日韩在线观看麻豆传媒公司 | 超碰久久网| 国产风韵犹存熟妇三区| 国产又长又大又粗的视频| 久99在线免费观看视频| 日韩中文字幕av在线播放| 美骚妇av高清在线| 亚洲国产亚洲天堂| AAAA欧美日韩| 爱av免费| 在线观看十八禁| 亚洲熟女一区二区| 成人AV超碰免费在线| 久久亚洲AV成人精品无码| 四虎影库国产精品免费| 色九九综合AV| 精品蜜乳AV免费观看| 丁香六月激情综合| 97精品综合久久网| 少妇久久久久久| 亚洲黄片免费在线播放| 国产吞精a级片激情电影| 精品国产污一区二区三区| 色香综合天天影视综合| 亚洲欧美小说| 五月婷婷性爱| 中国熟女91| 天堂中文资源在线bt| 狠狠搞 亚洲91| 精品久久97| 精品国产肉丝袜在线拍国语| 蜜桃久久久久久久久久久久| 成人午夜高潮av猛片| 97免费视频在线| 92午夜免费福利视频| 在线观看av区| 91精品国产91久久久久久久久久久久| 超碰97人妻免费在线| 精品国产精品一区二区| 天天性射网| 日韩一区二区三区四区五区| 九九热精品免费视频| 激情小说在线视频| 大鸡巴久久久| 欧美日日人人天天| 色色五月婷婷| 中欧人妻丝袜中文字幕| 青青草日韩无码| 亚洲天堂精品日韩电影| 性色高清在线| 国产理论视频在线播放| 欧美第五页| 久草视频分类在线| 亚洲黑人在线| 9久久美女首页| 99在线无码精品秘 入口黑人| 中文一区二区| 超碰人人草| 国产精品内射婷婷一级二| 97精品中文字幕| 色五月婷婷色| 99热18这里只有精品| 安徽熟妇视频| 东京热男人天堂| 夜夜操天天肏| 日韩AV无码网站| 久久五月份| 色妇综合网| 久久东京热久久| 亚洲色图殴美色图激情乱伦| 在线视频五十市| 综合一区中亚洲国产成人综合精品 | 婷婷激情五月| 亚洲 中文字幕 精品| 国产熟女二区| 巨爆乳肉感一区二区三区竹菊影视| 人人操人人肉久久精品| 久久久婷| 国产极品精品美女视频| 欧美熟爽综合| 国产成年免费大片黄在线观看| 大逼色网站| 久久亚洲色图中文字幕| 78m啪啪啪| 97国产色综合| 丁香五月天堂网| 黄片免费看的| 2020中文字幕在线观看| 亚洲黄色网址| 91在线美女| 激情五月综合| 国产a级午夜毛片| 国产一级高清免费观看| 97鸡把在线视频| 亚洲综合情色| 情色五月天久久久| 久久麻豆一区二区| 国产浮力影院第1页| 成人激情无码在线视频| 亚洲av噜噜噜噜噜噜| 激情内射| 少妇九九九九| 肉丝无码中文高清| 亚洲诱惑| 91中文精品日韩欧美在线 | 综合另类| 亚洲无码电影久久久| 婷婷性网| 一区二区三区麻豆| 在线综合网| 精品一级毛片在线观看| 日韩免费中文字幕视频| 搡老女人老熟女91老熟女综合网| 亚洲影视高清第一页| 亚洲天堂资源在线| 狠狠爱夜夜| 男人天堂电影院| 强奸抽插av| 久久精品国产亚洲AV无码做| 亚洲日韩精品一区视频在线| 草莓精品视频在线免费观看| 欧洲成人性爱视频| 亚洲AV无码国产精品久久久久 | av久日| jiujiujiujingpin| 中文字幕欧美日本乱码一线二线| 久久综合女优| 走光一区92下载| 欧美特黄视频网站| 精品久久久久久中文字幕视频免费| 亚洲婷婷综合网| 岛国黄色大片网站| 天天做天天爱天天高潮| 成人片视频| 深夜视频| 熟女人妻一区二区三区| 色五月综合网| 亚洲诱惑天堂| 无码一区免费在线不卡| 欧美日韩国产高清在线一二三区 | 日韩三级在线观看网站| 999 久久久| 女色视频社区| 成人乱码一区二区三少妇| 好爽视频在线观看视频 | 亚洲影视综合网| 国产精品女久久久久av爽| 羞涩视频| 漂亮人妻被强中文字幕hd| 一本一首道人妻少妇免费久久| 日韩人妻精品久久久久| 国产高清在线观看欧美| 欧美日韩国产成人高清| 久久精品电影在线| 美女91av| 美骚妇av高清在线| 亚洲 日本 国产 综合| 超碰78| 久久久涩| 蜜臀无码一区二区| 中文字幕文字幕无码一区二区三区电影99| 97天天爽| 婷婷五月色| 激情看片网站| 欧亚乱色熟女一区二区| 蜜臀AV秘一区翔田千里| 国产外初女出血视频| 我爱操| 亚州日韩97| 大香蕉啪啪啪啪在线| 人妻精品一区二区全免费| 丁香五月激情网| 超碰91在线| 丁香五月激情综合国产| 日韩精品亚洲专区在线影视| 久久美女国产| 视频一区二区免费在线| 狠狠入| 91性网| 国产97视频| 伊人91| 欧美牲| 9久精品| 在线观看中文字幕| 色婷婷国产精品一区在线观看| 777超碰| 国产精品视频内谢女人| 亚洲精品97| 麻豆天美91| 91精品无码久久久久久久| 热思思免费视频| 澳门黄片一香蕉视频| 国产精品麻豆免费视频| 性欧美91| 国产深夜福利| 色综合国产在线观看| 国产无码久久高清| 久久国产在线一区二区| 色婷婷六月丁香七月婷婷| 亚洲精品免费中文字幕| 高清国产精品无码| 精品国产丝袜一区二区三区乱码| 国产精品免费日韩| 亚卅熟女乱色| 中文字幕 人妻不满 在线视频| 国产亚洲99久久精品| 亚洲另类综合欧美| 久久久国产精品人妻丝袜| 足交视频老司机| 中文字幕欧洲有码| 爱丝福利| 国产精品久久泡妞网站| 亚洲男人电影天堂| 日小BB小视频| 色综合久| 久久久精品日本一道| 午夜天堂精品久久久久91| 欧美人妻二区三区| 99黄页网站| 亚洲中文字幕av| 91综合色| 91高清无码下载| 日本免费人成视频播放120秒| 日本日皮视频逼| 久操B网| 尤物视频网 刘玥| 蜜桃久久一区二区|