欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

C# Socket網(wǎng)絡(luò)通訊完整實(shí)現(xiàn):拆包、心跳與斷線重連

C# Socket網(wǎng)絡(luò)通訊完整實(shí)現(xiàn):拆包、心跳與斷線重連 簡(jiǎn)介C# Socket網(wǎng)絡(luò)通訊完整源碼面向初學(xué)C#網(wǎng)絡(luò)編程或需要快速搭建通訊原型的開發(fā)者。代碼基于.NET Windows窗體實(shí)現(xiàn)包含服務(wù)端與客戶端兩個(gè)獨(dú)立工程直接打開解決方案即可運(yùn)行清晰演示了Socket建立連接、收發(fā)消息等核心流程便于理解基本原理并在此基礎(chǔ)上擴(kuò)展。資源共61個(gè)文件以C#源碼14個(gè).cs為主另含解決方案與工程文件.sln/.csproj、窗口界面資源.resx以及可執(zhí)行程序與調(diào)試符號(hào).exe/.pdb等壓縮包僅1.17MB。項(xiàng)目結(jié)構(gòu)簡(jiǎn)潔服務(wù)端與客戶端分目錄組織適合對(duì)照學(xué)習(xí)兩端交互機(jī)制。已有2914人瀏覽學(xué)習(xí)代碼由作者自寫思路直白如果對(duì)實(shí)現(xiàn)有疑問還可聯(lián)系作者交流適合初學(xué)者快速上手也可作為自定義通訊功能的起點(diǎn)。1. C# Socket 網(wǎng)絡(luò)通訊源碼先看懂“完整”這兩個(gè)字意味著什么我見過不少人從網(wǎng)上下載了所謂完整的 C# Socket 網(wǎng)絡(luò)通訊源碼跑起來很簡(jiǎn)單客戶端一連、發(fā)幾句字符串、再收回來以為這就完事了。等放上業(yè)務(wù)流量才發(fā)現(xiàn)粘包、半包、斷線、客戶端多了之后互相擠掉全來了。這篇就把“完整”拆開看你會(huì)得到一套結(jié)構(gòu)清楚、能直接改的 C# Socket 網(wǎng)絡(luò)通訊方案同步阻塞模型做連接管理4 字節(jié)大端長(zhǎng)度前綴做拆包心跳加斷線重連兜底。它不是什么萬兆高并發(fā)框架但適合上位機(jī)、設(shè)備網(wǎng)關(guān)和中小型通訊服務(wù)也適合剛把注意力從“能連通”轉(zhuǎn)移到“能穩(wěn)定跑”的人。2. 選型與最小實(shí)現(xiàn)TcpClient 和 Socket 到底用哪套2.1 為什么我用 TcpListener / TcpClient 而不是裸 Socket網(wǎng)上很多“完整源碼”喜歡直接 new Socket然后鋪滿 BeginReceive、EndReceive、回調(diào)嵌套看著很唬人實(shí)際上把新手能看懂的部分全藏進(jìn)了委托里。我用 TcpListener / TcpClient 是這么考慮的它們本身是對(duì) Socket 的封裝把抓包、綁定、監(jiān)聽這些臟活吃了同時(shí)你在需要時(shí)還能通過 client.Client 把底層 Socket 拿回來設(shè)置 NoDelay、Linger 這些關(guān)鍵參數(shù)并不會(huì)有功能損失。裸 Socket 的優(yōu)勢(shì)在需要精細(xì)控制介入點(diǎn)的時(shí)候比如實(shí)現(xiàn) IOCP、收原始包、控制收發(fā)粒度。而我見過的絕大多數(shù)上位機(jī)需求本質(zhì)上是“若干個(gè)客戶端連進(jìn)來交換定長(zhǎng)或變長(zhǎng)命令”這個(gè)負(fù)載用同步阻塞模型完全扛得住。有人說同步模型性能差得分場(chǎng)景。長(zhǎng)連接應(yīng)用的主要瓶頸往往不在阻塞讀而在業(yè)務(wù)處理線程的排隊(duì)策略。幾百個(gè)連接、每秒幾十上百個(gè)報(bào)文同步模型在可控范圍內(nèi)代碼卻比異步回調(diào)好維護(hù)一個(gè)量級(jí)。等真到了單機(jī)幾千連接再換 SocketAsyncEventArgs 不遲到時(shí)這些封幀、拆包、心跳代碼照樣能復(fù)用。至于 Task 異步接受客戶端我也只在第一層用 —— 一個(gè)專門 accept 循環(huán)每個(gè)客戶端進(jìn)來丟給線程池處理。這樣監(jiān)聽線程不會(huì)被阻塞新客戶端也能盡快接入而入站數(shù)據(jù)的讀取在各自任務(wù)里保持同步順序讀好調(diào)試多了。2.2 最小服務(wù)端監(jiān)聽、接客戶端、讀字節(jié)流先把最基礎(chǔ)的跑通。這段代碼是后面所有邏輯的地基先不要做幀解析只驗(yàn)證能連上、能讀數(shù)據(jù)。using System.Net; using System.Net.Sockets; using System.Text; var listener new TcpListener(IPAddress.Any, 9000); listener.Start(100); // backlog100允許排隊(duì)等待 accept 的連接數(shù) Console.WriteLine(listening on 0.0.0.0:9000); while (true) { TcpClient client await listener.AcceptTcpClientAsync(); _ Task.Run(() HandleClientAsync(client)); } static async Task HandleClientAsync(TcpClient client) { using (client) using (NetworkStream stream client.GetStream()) { Console.WriteLine($client in: {client.Client.RemoteEndPoint}); var buffer new byte[4096]; int read; while ((read stream.Read(buffer, 0, buffer.Length)) 0) { string chunk Encoding.UTF8.GetString(buffer, 0, read); Console.WriteLine($recv: {chunk}); } Console.WriteLine(client disconnected); } }邏輯說明AcceptTcpClientAsync 每等到一個(gè)連接就返回一個(gè) TcpClient我把它丟給線程池處理。HandleClientAsync 里先拿 NetworkStream這是讀寫的核心對(duì)象注意 GetStream 返回的是包裝實(shí)例循環(huán)里復(fù)用本地變量不要每次調(diào)用。Read 是阻塞的沒有數(shù)據(jù)時(shí)線程就掛在那里來數(shù)據(jù)才繼續(xù)。Read 返回 0 表示對(duì)端正常關(guān)閉這是“連接結(jié)束”的信號(hào)不是錯(cuò)誤不做特殊處理循環(huán)退出后 using 自動(dòng)釋放連接。參數(shù)說明監(jiān)聽地址用 IPAddress.Any 表示綁定到本機(jī)所有網(wǎng)卡適合服務(wù)端。如果只希望本機(jī)訪問可以改成 IPAddress.Loopback。端口 9000 是測(cè)試端口實(shí)際部署避開常見端口沖突就行。backlog 寫 100很多源碼不填這個(gè)參數(shù)默認(rèn)值在不同操作系統(tǒng)上表現(xiàn)不一致填 100 能讓突發(fā)連接不被內(nèi)核直接拒絕。buffer 4096 是讀取緩沖不是單條報(bào)文上限實(shí)際報(bào)文可以比它大Read 只會(huì)返回當(dāng)前內(nèi)核緩沖里能拿到的一塊完整報(bào)文可能要分多次讀這就是后文要解決的半包問題。2.3 最小客戶端連接、發(fā)數(shù)據(jù)、優(yōu)雅關(guān)閉客戶端的重點(diǎn)是把 NoDelay 打開。Nagle 算法會(huì)把小數(shù)據(jù)包攢在一起發(fā)送交互式命令就會(huì)莫名慢個(gè)幾十毫秒。NoDelay 犧牲一點(diǎn)網(wǎng)絡(luò)利用率換來命令即時(shí)性上位機(jī)場(chǎng)景默認(rèn)打開。using System.Net.Sockets; using System.Text; using var client new TcpClient(); client.NoDelay true; client.SendTimeout 5000; client.ReceiveTimeout 5000; await client.ConnectAsync(127.0.0.1, 9000); await using NetworkStream stream client.GetStream(); byte[] body Encoding.UTF8.GetBytes(ping); byte[] frame new byte[4 body.Length]; Array.Copy(body, 0, frame, 4, body.Length); await stream.WriteAsync(frame, 0, frame.Length); Console.WriteLine(sent);這段只演示連接和發(fā)送注意 frame 前 4 個(gè)字節(jié)還沒填長(zhǎng)度值因?yàn)檎嬲捎玫姆鈳胚M(jìn)第 3 章協(xié)議里。SendTimeout 和 ReceiveTimeout 是同步讀寫時(shí)的超時(shí)時(shí)間單位毫秒。超過這個(gè)時(shí)間讀寫會(huì)拋 IOException線程得以退出而不是永遠(yuǎn)卡死。這個(gè)超時(shí)在斷線檢測(cè)里很重要配合心跳能兜住網(wǎng)絡(luò)異常。選型到這里已經(jīng)有了結(jié)論TcpListener/TcpClient 做殼NetworkStream 做讀寫NoDelay 必開超時(shí)必設(shè)。這套模型代碼直白讀線程就是一個(gè) while 循環(huán)加一個(gè) Read斷線時(shí)沿著調(diào)用棧往上翻就能看到原因比回調(diào)套回調(diào)的異步寫法容易排查多了。3. 數(shù)據(jù)幀設(shè)計(jì)與拆包粘包半包問題是分水嶺3.1 TCP 是字節(jié)流根本沒有報(bào)文邊界把上章的代碼丟到真實(shí)環(huán)境你會(huì)發(fā)現(xiàn)客戶端連續(xù)發(fā)三條消息服務(wù)端可能一次 Read 就全讀到也可能發(fā)一條 10KB 的消息服務(wù)端分四次才讀完。這不是 Bug是 TCP 的本質(zhì)。TCP 只保證字節(jié)有序到達(dá)不保證應(yīng)用層的“一條消息”完整地出現(xiàn)在一次 Read 里。多條消息被合并讀出來叫粘包一條消息被拆成多次讀叫半包兩者是同一個(gè)問題的兩面。很多入門源碼直接用 Read 的返回長(zhǎng)度去解析一條消息然后把解析邏輯寫在 while 循環(huán)里。半包時(shí)第一條消息沒讀全就被拿去解析了第二條消息開頭被切掉粘包時(shí)第二個(gè)包被錯(cuò)當(dāng)成第一個(gè)包的尾巴。表現(xiàn)就是本地調(diào)試偶爾正常一上局域網(wǎng)就亂碼、卡死、命令錯(cuò)亂而且不好復(fù)現(xiàn)。這種不穩(wěn)定是最影響信任感的。解決思路很統(tǒng)一應(yīng)用層自己定義幀格式接收端先把字節(jié)囤起來湊夠一幀再交給業(yè)務(wù)邏輯。這就是拆包器的職責(zé)。3.2 協(xié)議設(shè)計(jì)4 字節(jié)大端長(zhǎng)度 負(fù)載我用來降低理解成本又不短視的格式是字段長(zhǎng)度說明FrameLen4 字節(jié)大端表示后面負(fù)載的字節(jié)數(shù)不含這 4 字節(jié)本身Body變長(zhǎng)負(fù)載內(nèi)部第 1 字節(jié)可作命令字后續(xù)是數(shù)據(jù)區(qū)長(zhǎng)度字段用 4 字節(jié)而不是 2 字節(jié)是怕日后單條消息超過 64KB。2 字節(jié)上限 65535看起來夠用但你要是傳個(gè)固件包、傳段配置 JSON 超過這個(gè)數(shù)就得改協(xié)議所有客戶端跟著重發(fā)后悔藥都沒處買。4 字節(jié)上限 2GB對(duì)絕大多數(shù)場(chǎng)景等于沒有上限。字節(jié)序要統(tǒng)一用大端。C# 在 Windows 上默認(rèn)小端C/C 的 socket 實(shí)現(xiàn)、Java、PLC 網(wǎng)關(guān)、Modbus TCP 網(wǎng)關(guān)這類設(shè)備普遍按網(wǎng)絡(luò)字節(jié)序也就是大端理解整數(shù)。如果你只在 C# 之間通訊大小端無所謂一旦哪天對(duì)接西門子 OPC、第三方便攜式設(shè)備或網(wǎng)關(guān)小端直接讀成相反字節(jié)序數(shù)字就全錯(cuò)了。所以協(xié)議從第一天就按大端走。public static byte[] BuildFrame(byte command, byte[] payload) { int bodyLen payload null ? 0 : payload.Length; var frame new byte[4 bodyLen]; // 大端寫入長(zhǎng)度跨語(yǔ)言、跨平臺(tái)通用 byte[] lenBytes BitConverter.GetBytes(bodyLen); if (BitConverter.IsLittleEndian) { Array.Reverse(lenBytes); } Array.Copy(lenBytes, 0, frame, 0, 4); frame[4] command; // 第1字節(jié)命令字如 0x01PING if (payload ! null bodyLen 0) { Array.Copy(payload, 0, frame, 5, bodyLen); } return frame; }封幀時(shí)把長(zhǎng)度寫到前 4 字節(jié)然后直接放命令字和負(fù)載。用 BitConverter 加一次 IsLittleEndian 判斷是為了兼容 .NET Framework 4.x 老工程那里沒有 BinaryPrimitives。如果你在 .NET 6 環(huán)境可以換成 BinaryPrimitives.WriteInt32BigEndian(frame, bodyLen)代碼更干凈。拆包時(shí)我維護(hù)一個(gè)接收緩沖區(qū)可以用 List 簡(jiǎn)單清楚流量不大時(shí)完全夠用。核心邏輯是循環(huán)先看有沒有 4 字節(jié)長(zhǎng)度有就解析出 bodyLen再看緩沖區(qū)里的字節(jié)夠不夠一幀夠就取出、移除不夠就退出循環(huán)等下次讀到的字節(jié)。這一步同時(shí)解決了粘包和半包——粘包時(shí)循環(huán)能取出多幀半包時(shí)剩下的不足一幀就攢著。public Listbyte[] TryDecodeFrames(Listbyte buffer, out int offset) { var frames new Listbyte[](); offset 0; while (buffer.Count - offset 4) { byte[] lenBytes buffer.GetRange(offset, 4).ToArray(); if (BitConverter.IsLittleEndian) { Array.Reverse(lenBytes); } int bodyLen BitConverter.ToInt32(lenBytes, 0); // 協(xié)議破壞時(shí)直接斷開不能死等 if (bodyLen 0 || bodyLen 1024 * 1024 * 64) { throw new InvalidDataException($invalid frame length {bodyLen}); } if (buffer.Count - offset 4 bodyLen) { break; // 半包剩余字節(jié)不夠等下次 Read 追加 } byte[] body buffer.GetRange(offset 4, bodyLen).ToArray(); frames.Add(body); offset 4 bodyLen; } return frames; }調(diào)用處把 Read 到的字節(jié) Append 進(jìn)緩沖區(qū)再把 offset 之前的內(nèi)容移除避免 List 無限增長(zhǎng)。參數(shù)說明bodyLen 上限 64MB 是保護(hù)值防止對(duì)端異常時(shí)拋出一個(gè) 2GB 長(zhǎng)度值這里會(huì)一直等不到數(shù)據(jù)連接變成僵尸。凡是長(zhǎng)度不在合理區(qū)間一律按協(xié)議錯(cuò)誤斷開。注意拆包器返回的 body 第 1 字節(jié)是命令字。業(yè)務(wù)分發(fā)時(shí)先 switch 命令字再解析后續(xù)數(shù)據(jù)不要把命令字和數(shù)據(jù)區(qū)混在一起切。拆包器怎么做完把緩沖區(qū)移除邏輯補(bǔ)上Listbyte recvBuffer new(); int read await stream.ReadAsync(buffer, 0, buffer.Length); if (read 0) break; // 對(duì)端關(guān)閉 recvBuffer.AddRange(buffer.Take(read)); var frames TryDecodeFrames(recvBuffer, out offset); recvBuffer.RemoveRange(0, offset);參數(shù)和邊界offset 是本次成功解析出的總字節(jié)數(shù)沒解析完的半包保留在 recvBuffer 里繼續(xù)攢。這樣不管對(duì)端怎么粘包拆包上層拿到的都是完整幀。這一步做完通訊框架才算過了分水嶺。4. 避坑連接被強(qiáng)關(guān)、接收返回 0、跨線程 UI 等 5 個(gè)高頻問題4.1 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接現(xiàn)象發(fā)送或接收時(shí)拋出 SocketException錯(cuò)誤碼 10054 / WSAECONNRESET意思是“對(duì)端已經(jīng)把連接重置了”。常見于客戶端崩潰后服務(wù)端還在往這條連接上寫數(shù)據(jù)或者服務(wù)端收到了一個(gè)在連接關(guān)閉時(shí)已發(fā)出的 RST 包。原因TCP 連接在異常退出時(shí)內(nèi)核會(huì)發(fā)送 RST 而不是 FIN。RST 一旦發(fā)出連接立刻銷毀雙方緩沖區(qū)全部丟棄。發(fā)送方只要往這個(gè)已死連接上再碰一下馬上觸發(fā) 10054。解決發(fā)送邏輯不能只靠 TcpClient.Connected 判斷這個(gè)屬性在 RST 之后往往還是 true。真正可靠的是發(fā)送時(shí)捕獲 SocketException檢測(cè) ErrorCode 為 10054 或 10053然后觸發(fā)斷線重連流程把這條連接的所有資源釋放掉。像這樣try { await stream.WriteAsync(frame, 0, frame.Length); } catch (SocketException ex) when (ex.ErrorCode is 10054 or 10053 or 10060) { MarkDisconnected(); // 清理本地連接狀態(tài)進(jìn)入重連邏輯 }10060 是連接超時(shí)也一并歸入斷線。很多人把異常吞掉繼續(xù)下一個(gè)循環(huán)發(fā)送結(jié)果是每次發(fā)送都拋一次異常日志刷屏連接永遠(yuǎn)不恢復(fù)。正確的做法是任何 SocketException 都視為連接已損壞直接退出讀寫循環(huán)。4.2 Read 返回 0 當(dāng)成錯(cuò)誤處理現(xiàn)象服務(wù)端日志里莫名出現(xiàn) IOException“無法從傳輸連接中讀取數(shù)據(jù)”查代碼發(fā)現(xiàn)有人在 read 0 時(shí)直接拋了異常。原因TCP 對(duì)端正常關(guān)閉時(shí)Read 返回 0這是 EOF不是錯(cuò)誤。把 0 當(dāng)異常處理客戶端主動(dòng)斷開后服務(wù)端就要多拋一次無意義異常還可能掩蓋真正的斷線邏輯。解決recv 循環(huán)里 read 0 一律走正常斷開分支釋放資源、清理會(huì)話不打印堆棧。收到 0 就表示對(duì)方不會(huì)再發(fā)數(shù)據(jù)了后續(xù)也可以從業(yè)務(wù)狀態(tài)里標(biāo)記在線離線。這樣“對(duì)端正常退出”和“網(wǎng)絡(luò)異常中斷”兩個(gè)語(yǔ)義被分開前者靜默處理后者走重連。4.3 NetworkStream.Write 不一定一次全寫進(jìn)去現(xiàn)象發(fā)送大報(bào)文時(shí)對(duì)端收到的數(shù)據(jù)被截?cái)嗷蛘叱霎惓?“無法將數(shù)據(jù)寫入傳輸連接”。很多人以為 Stream.Write 和 Read 一樣能寫多少寫多少。實(shí)際上 NetworkStream.Write 會(huì)嘗試寫完所有字節(jié)但對(duì)于正處于限速或緩沖滿的 socket底層會(huì)出現(xiàn)部分寫入。原因套接字發(fā)送緩沖區(qū)滿、對(duì)端接收速度跟不上、Nagle 與延遲 ACK 相互作用都可能導(dǎo)致單次寫操作無法完全耗盡你的數(shù)據(jù)。解決自己實(shí)現(xiàn)一個(gè)發(fā)送全量數(shù)據(jù)的函數(shù)循環(huán)補(bǔ)寫直到所有字節(jié)都落進(jìn) socket 緩沖或者發(fā)生異常退出private static async Task WriteAllAsync(NetworkStream stream, byte[] frame) { int offset 0; while (offset frame.Length) { int written await stream.WriteAsync(frame, offset, frame.Length - offset); if (written 0) { throw new SocketException((int)SocketError.ConnectionReset); } offset written; } }如果只在 C# 里使用 TcpClientNetworkStream.Write 本身做了全量保證這個(gè)函數(shù)可作為防御層如果你改用 Socket.Send這個(gè)循環(huán)就是必須的。注意粘包、半包的工作交給第 3 章的幀解析發(fā)送端不要為了“省流量”而合并多條消息也不要為了“防粘包”故意把消息拆開發(fā)送。發(fā)送端只保證幀完整寫入接收端只負(fù)責(zé)按幀邊界解析各司其職。4.4 跨線程訪問 UI 控件現(xiàn)象WinForms / WPF 程序里Recv 線程處理完消息后直接給 TextBox 或日志控件賦值調(diào)試時(shí)拋“跨線程操作無效”或者控件顯示卡頓、閃退。原因UI 控件只能在創(chuàng)建它的線程主線程上操作。Socket 接收回調(diào)在 ThreadPool 線程上執(zhí)行直接訪問控件就是非法操作。網(wǎng)上的簡(jiǎn)單源碼大多數(shù)忽略了這層一放真實(shí)項(xiàng)目必然翻車。解決把要更新的內(nèi)容打包切換到同步上下文。WinForms 就用 BeginInvokeWPF 用 Dispatcherprivate void AppendLog(string message) { if (txtLog.InvokeRequired) { txtLog.BeginInvoke(new Action(() txtLog.AppendText(message Environment.NewLine))); } else { txtLog.AppendText(message Environment.NewLine); } }注意 BeginInvoke 是異步的接收線程不會(huì)停下來等 UI這樣高頻消息時(shí)也能流暢追加。如果消息量很大建議在接收線程只把原始幀塞進(jìn)隊(duì)列UI 用自己的 Timer 周期性取隊(duì)列消費(fèi)避免每條消息都跨線程這個(gè)模型放到 5.3 的生產(chǎn)者消費(fèi)者部分講。4.5 端口被占用或 backlog 設(shè)置錯(cuò)誤現(xiàn)象服務(wù)端重啟時(shí)報(bào) SocketException “通常每個(gè)套接字地址協(xié)議/網(wǎng)絡(luò)地址/端口只允許使用一次”或者客戶端連接被拒絕。多個(gè)實(shí)例同時(shí)監(jiān)聽同一個(gè)端口是最常見原因但還有個(gè)隱蔽場(chǎng)景上一次程序退出時(shí)連接沒釋放干凈端口進(jìn)入 TIME_WAIT。原因TCP 主動(dòng)關(guān)閉方會(huì)進(jìn)入 TIME_WAIT持續(xù) 2MSL約 1-4 分鐘期間端口不能立即復(fù)用。如果服務(wù)器在代碼里主動(dòng) Close 了監(jiān)聽 socket但沒有關(guān)閉所有客戶端連接重啟時(shí)監(jiān)聽端口就可能被占用。解決監(jiān)聽 socket 設(shè)置 ExclusiveAddressUse 為 false 并打開 ReuseAddress允許端口快速重用listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); listener.Server.ExclusiveAddressUse false; listener new TcpListener(IPAddress.Any, 9000);但注意這只解決監(jiān)聽端口復(fù)用不能解決客戶端連接復(fù)用??蛻舳酥鲃?dòng)斷開前要調(diào)用 Shutdown(SocketShutdown.Both) 讓對(duì)端感知再關(guān)閉這樣 TIME_WAIT 留在客戶端側(cè)而不是服務(wù)端側(cè)。服務(wù)端被動(dòng)斷開不會(huì)產(chǎn)生 TIME_WAIT所以服務(wù)端要盡量避免作為主動(dòng)關(guān)閉方。5. 多客戶端接入與心跳?;畎淹婢咦兂赡苡每蚣?.1 ConcurrentDictionary 管理在線客戶端前面的 HandleClientAsync 處理完一個(gè)客戶端就結(jié)束了多個(gè)客戶端同時(shí)連接時(shí)任務(wù)之間互相不知道對(duì)方的存在。要支撐心跳檢查和廣播就需要一個(gè)全局字典把連接標(biāo)識(shí)映射到客戶端狀態(tài)。我一般這么組織public class ClientSession { public string Id { get; set; } public TcpClient Tcp { get; set; } public NetworkStream Stream { get; set; } public volatile int LastAliveTick; public CancellationTokenSource Cts { get; } new(); } ConcurrentDictionarystring, ClientSession _sessions new();客戶端接入時(shí)生成一個(gè)唯一 IdGuid.NewGuid().ToString(N)注冊(cè)進(jìn)字典。接收線程退出后從字典移除。用 ConcurrentDictionary 而不是普通 Dictionary是因?yàn)楸O(jiān)聽線程、業(yè)務(wù)線程、心跳巡檢線程會(huì)同時(shí)讀寫字典普通 Dictionary 在高并發(fā)下會(huì)內(nèi)部狀態(tài)損壞甚至死鎖。LastAliveTick 用 volatile int每次接收到任何字節(jié)就更新為 Environment.TickCount。為什么不用 DateTime.Now因?yàn)榄h(huán)境可能被校時(shí)機(jī)器時(shí)鐘往回跳會(huì)讓“最后活躍時(shí)間”倒退導(dǎo)致心跳超時(shí)誤判。Environment.TickCount 是開機(jī)以來的毫秒數(shù)單調(diào)遞增雖然 25 天左右會(huì)翻轉(zhuǎn)到負(fù)數(shù)但差值計(jì)算不受翻轉(zhuǎn)影響比如 now - lastAliveTick 只要注意用 int 運(yùn)算短連接場(chǎng)景完全夠。5.2 服務(wù)端心跳巡檢超時(shí)沒消息就斷開TCP 長(zhǎng)連接有一個(gè)問題客戶端斷電、網(wǎng)線拔掉、路由重啟時(shí)本端不會(huì)立刻收到 FIN 或 RST連接就像“假死”。要探測(cè)假死就得靠應(yīng)用層心跳。我通常在協(xié)議里加兩個(gè)命令字0x01 PING0x02 PONG??蛻舳嗣扛?10 秒發(fā) PING服務(wù)端收到 PING 就回 PONG服務(wù)端同時(shí)記錄 LastAliveTick。巡檢線程每 2 秒掃一遍所有會(huì)話如果 now - LastAliveTick 超過 30 秒就強(qiáng)制斷開。這里參數(shù)不能隨便拍PING 10 秒、巡檢 2 秒、超時(shí) 30 秒。超時(shí)比 PING 間隔大 3 倍是為了容忍網(wǎng)絡(luò)瞬時(shí)抖動(dòng)和 GC 卡頓避免誤殺正??蛻舳?。超時(shí)設(shè)成 6 秒局域網(wǎng)還有可能跨交換機(jī)稍微一擁塞就全斷。private async Task WatchdogLoopAsync(CancellationToken token) { while (!token.IsCancellationRequested) { await Task.Delay(2000, token); foreach (var kv in _sessions.ToArray()) { ClientSession s kv.Value; if (Environment.TickCount - s.LastAliveTick 30_000) { s.Cts.Cancel(); // 中斷阻塞在 ReadAsync 的線程 } } } }這里的高頻操作是遍歷字典并檢查時(shí)間不涉及鎖。取消用的是 CancellationTokenSource不是因?yàn)?ReadAsync 必須用它而是因?yàn)樗芨蓛舻匕炎枞械慕邮昭h(huán)打斷。HandleClientAsync 里要把 s.Cts.Token 傳給 ReadAsyncint read await s.Stream.ReadAsync(buffer, 0, buffer.Length, s.Cts.Token);一旦 CancelReadAsync 拋 OperationCanceledException接收循環(huán)退出finally 里關(guān)閉連接并移出字典。注意不要直接調(diào)用 tcp.Close() 去打斷 ReceiveClose 同時(shí)會(huì)釋放 Socket 句柄接收線程可能還在操作一個(gè)已釋放的句柄導(dǎo)致 ObjectDisposedException 滿天飛。先 Cancel 讓接收線程自己退出再用 using 清理資源是這個(gè)方案的關(guān)鍵順序。5.3 客戶端斷線重連與生產(chǎn)者消費(fèi)者隊(duì)列客戶端側(cè)要做的和 Timing 無關(guān)只要記住斷線是常態(tài)重連要有退避。我常用的重連循環(huán)是int retry 1; while (true) { try { await tcp.ConnectAsync(ip, port); break; // 連上 } catch (SocketException) { int delay Math.Min(5000, 200 * (1 Math.Min(retry, 5))); await Task.Delay(delay); retry; } }退避從 200ms 起步每次翻倍封頂 5 秒。連上后 retry 重置為 1。不能做成每隔 5 秒固定重試因?yàn)榉?wù)器重啟那幾秒內(nèi)連接會(huì)密集失敗退避能避免把服務(wù)器日志刷爆。業(yè)務(wù)數(shù)據(jù)不直接塞給 NetworkStream而是放進(jìn)一個(gè)有界隊(duì)列由單一發(fā)送協(xié)程消費(fèi)。這就是生產(chǎn)者消費(fèi)者模型好處是削峰防止業(yè)務(wù)線程追趕網(wǎng)絡(luò)線程導(dǎo)致內(nèi)存無上限增長(zhǎng)。var queue new BlockingCollectionbyte[](boundedCapacity: 1024); async Task SendLoopAsync(CancellationToken token) { foreach (byte[] frame in queue.GetConsumingEnumerable(token)) { await WriteAllAsync(session.Stream, frame); } }boundedCapacity 設(shè)為 1024 時(shí)隊(duì)列滿后生產(chǎn)端會(huì)阻塞這是背壓機(jī)制業(yè)務(wù)方必須等網(wǎng)絡(luò)消費(fèi)完才能繼續(xù)生產(chǎn)而不是無限堆內(nèi)存。真實(shí)項(xiàng)目里遇到內(nèi)存暴漲先查這里是不是有界隊(duì)列。這樣一套組合下來服務(wù)端和客戶端都有了連接管理、幀解析、心跳、斷線重連、背壓保護(hù)。源碼不再是一坨演示代碼而是一個(gè)能撐住真實(shí)業(yè)務(wù)流量的骨架。6. 壓測(cè)與上線前檢查跑滿 50 連接 x 2000 次回顯再說寫個(gè)小壓測(cè)工具比嘴上說“沒問題”可靠得多。我習(xí)慣這樣驗(yàn)證50 個(gè)并發(fā)連接每個(gè)連接連續(xù)發(fā) 2000 條回顯消息每條消息帶 GUID 校驗(yàn)只要一條對(duì)不上就算失敗。Parallel.For(0, 50, i { using var tcp new TcpClient(); tcp.Connect(127.0.0.1, 9000); using NetworkStream stream tcp.GetStream(); for (int j 0; j 2000; j) { string body $msg-{i}-{j}-{Guid.NewGuid():N}; byte[] frame BuildFrame(0x10, Encoding.UTF8.GetBytes(body)); WriteAllAsync(stream, frame).GetAwaiter().GetResult(); byte[] reply ReadOneFrame(stream); if (Encoding.UTF8.GetString(reply) ! body) { throw new Exception($mismatch {i}-{j}); } } Console.WriteLine($conn {i} done); });壓測(cè)通過不代表上線無憂我再順手做三件事先用 netstat -an 確認(rèn)沒有大量 CLOSE_WAIT 堆積再觀察服務(wù)端內(nèi)存發(fā)送端隊(duì)列有沒有無限增長(zhǎng)最后把日志級(jí)別調(diào)到 Debug確認(rèn)沒有半包重組異常和重連風(fēng)暴。這套流程走完我心里才踏實(shí)。做上位機(jī)頭兩年我也迷信過異步高性能那一套后來發(fā)現(xiàn)通訊系統(tǒng)的坑從來不在 API 層級(jí)而在幀邊界、心跳時(shí)序、資源釋放這些基礎(chǔ)細(xì)節(jié)上。參數(shù)是死的網(wǎng)絡(luò)是活的這些底盤沒搭穩(wěn)換個(gè)框架照樣翻車。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情久久 婷婷| 蜜臀AV在线观看| 97人人搞| 国产亚洲成AV人片在线观黄桃| 五月婷婷开心综合| 好好干Av| 亚洲AV免费在线| 五月美女婷婷风骚| 国产色色视频| 日本va欧美va国产激情| 日日狠夜夜狠| 五月天婷婷青青草| 四色永久成人网站| 久久婷婷五月天激情四射| 思思99热| CHINESE熟女老女人HD视频| 99热这里只有精品9| 亚洲综合999| 亚洲日韩一页精品发布| A片试看120分钟做受图片| 超碰网站在线观看| 日日日影院| 久久WW| 99在线精品免费视频| 香蕉视频性爱BB做爱| 日韩人妻无码专区| 五月丁香六月激情欧美综合| 天天干天天色综合| 国产精品色色色色| 热的五码久久精品| Se.婷婷五月天| 亚洲传媒在线观看| 一起草aV| www99精品日韩| 内射爽无广熟女亚洲| 色五月丁香婷婷| 丁香婷婷综合精品六月初| 久久曰9| 亚洲激情久久| 久久久天堂国产精品女人| 天堂综合久| 六月丁香婷啪射| 色色色色色五月丁香| 思思久久99热只有频精品66| 91se精品国产| 在线看片h站| 欧美叉叉叉BBB网站| 日日操夜夜撸| 日韩另类| 九九色网专区| 五月天婷婷情色| 日韩黄色影院| 天天操精品| 色色色色色日韩午夜激情| 久久综合丁香激情五月| 亚洲九九夜夜| 成人AV在线中文版| 一区二区三区四区无码| 色五月激情| 干婷婷五月天| 狠狠色激情综合| 五月色欧美| 丁香五月激情澎湃一区| 色五月大| 碰碰91| 中文乱子伦视频| 五月丁香直播| 一本色道久久综合狠狠躁小说| 色噜噜狠狠色综无码久久合欧美| 久久亚洲天堂| 开心五月激情网| 欧美婷婷| 丁香情色五月| 99男人天堂| 天天操无码| 激情图片久久| 深爱五月天 开心网| 五月香婷婷| 国产视频久色| 婷婷九月激情| 日本精品久久久久中文字幕| 激情丁香久久| 狠狠色丁婷婷日日,伊人激情综合网 | 五月丁香在线观看99| 丁香五月天AV在线| 五月天色色激情综合| 久久在这里有精品| 生活片五区| 色情五月综合婷婷| 欧美性久| 精品国产va久久久久| 婷婷在线视频| aaa久久久| 97碰在线免费观看| 婷婷丁香五月天婷婷| 婷婷色丁香五月| 九九成人高清视频| 久久久久婷婷| 99久操| 手机AVAV天堂看网| 99热官网精品在线| 成人婷婷| 日日夜夜噜噜爽爽| 日韩免费视频| 久久99热这里只有| 在线成人网址| 久草热8精品视频在线观看 | 五月婷婷五月天激情视频| 5月婷婷激情网| 日日噜狠狠色综合久| 丁香五月色| 丁香婷婷天堂| 啪啪激情网| 日日日,com| 狠狠草狠狠草| 丁香五月婷婷影院| 激情丁香九九五月综合网| 五月丁香日本一抹本| 天天拍夜夜爽日日| 伊人综合网站| 婷婷午夜精品久久久| 激情丁香五月婷| 亚洲综合婷婷| 影音先锋 萱萱| 丁香久久九九99| 天天摸,天天爽| 四月丁香五月婷婷久久| 婷婷婷婷婷婷婷婷| 欧美色必爱| 三级成人网站| 99热精品免费| 欧美又粗又大一区二区在线观看| 六月丁香五月婷婷| 七七九色| 九九热只有精品| 日韩成人无码| 9999热这里只有精品| 91人操| 双性美人被调教到喷水A片| 色三级色三级| 久久3p| 99热www| 99国产这里只有精品| 国产欧美日韩综合精品一区二区| 五月丁香人人婷婷在线观看| 六月婷婷中文字幕| 草美女在线观看视频在线播放| 91超级碰碰碰| 色五月婷婷综合在线| 亚洲欧美另类在线23p| 激情综合网五月婷婷| 好叼操在线观看| 色婷婷丁香AV综合| 五月天网址在线刘玥| 精品网站:999WWW| 婷婷五月天av小说| 呦呦v线| 国产看真人毛片爱做A片| 四色综合网| 天天透天天爱| 亚洲色情久久| 久久婷五月| 99热国内精品| 97香蕉久久超级碰碰高清版 | 久久九九玖玖| 在线观看婷婷5月| 日本少妇AA一级特黄大片| 丁香六月欧美| 六月色 亚洲| 婷婷噜噜| 丁香女人五月天| 极品人妻VIDEOSSS人妻| 五月丁香亚洲婷婷| 这里只有精品视频视频在线观看| 婷婷综合网| 丁香五月大香蕉AV| 欧美日比视频| 激情二色月| 香蕉99网| 另类A片| 精品视频这里只有精品| 婷婷丁香五月天大香蕉| 色优久久| 成年人99热| 蜜桃婷婷狠狠久久综合| 婷婷永久在线| 葵花AV在线| 色婷婷亚洲六月婷婷中文字幕| 五月婷亚洲精品AV天堂| 色婷婷五月天| 五月丁香六月色| 视频这里只有精品| 婷色影院| 热99在线精品| 五月丁香婷婷伊人| 久久婷婷青草五月天| 99热| 久久狠狠干| 影视av久久久噜噜噜噜噜三级| 99免费视频| 五月丁香婷婷三级| 久久99最新| 七七色综合| 亚洲色网址| 狠狠干天天内射| 日日噜噜久久婷婷五月天| 亚洲视色| 26uuu另类亚洲欧美日本一| 婷婷久久五月丁香| 五月丁香综合成人社区| 丁香六月婷婷| 激情六月天婷婷| 色婷婷丁香六月| 日本人妻伦在线中文字幕| 亚洲丁香五月天视频| 欧美婷婷六月丁香综合色连续高潮抽搐| 色综合色色色色色色综合| 国产成人AV在线播放| 色色激情五月天| 九月婷婷综合八月丁香在线观看| 欧美影院婷婷| 婷婷五月丁香激情图片| 六月丁香啪啪啪| 五月婷婷婷丁香播| 一本色道久久综合狠狠躁小说| 婷婷五月丁香基| 色婷大香蕉| 99热在线观看| 99ER热精品视频| 五月婷婷综合网| 99热都是精品| 婷婷五月天亚洲五码| 伍月婷婷六月丁香| 丁香婷婷成人在线播放| 婷婷五月亚洲激情| 国产亚洲99| 婷婷丁香色情| 久久五月丁香| 国产阿姨日皮艹逼内射视频| 开心激情色婷婷五月天| 最新五月天婷婷影| 甈你aaaaa| 中美日韩成人在线| 色婷婷综合网站| 六月婷婷香蕉| 欧美碰碰| 色吧网91| 久久一级免费黄色片| 久久五月激情| 99亚州综合精品成人网| 五月天婷综合| 欧美色婷婷| 激情九月婷婷| 99在线精品免费视频| 天天天天操| 九九99精品| 久久婷婷视频| 97精品综合久久| 亚洲色婷婷五月| www色色色com| 五月婷婷激情色情网| 色欲五月婷婷| 99re这里只有精品免费| 婷婷五月丁香六月天亚洲综合| 毛片新网地| 97亚洲色 torrent magnet| 激情五月综合网| 热99国产精品| 五月婷婷丁香综合| 激情婷婷丁香五月天| 色五月天成人| 五月天开心网| 精品国婬伦V无码久久久| 久9热在线免费观看| 亚洲亚洲人成综合网络| 夜夜爱影院| 曰本aaaaaa丈片| 第四色网婷婷| 91超级碰| 五月开心激情| 久久草大香蕉| 99热在线观看99| 日韩欧美一道四区中文字幕| 亚洲av日韩无码| 黄色99视频| 六月婷五月丁香| 天天噜天天爱| 六月婷婷色色色| 中文字幕在线观看视频www| www.五月天婷婷| 五月欧美丁香在线观看| 色综合五月天| 国产AV影片| 天综合日日夜综合7799| 五月丁香操婷逼| 天天天操天天天爰| 97人人做| 亚洲天堂色| 五月丁香色停停啪啪啪| 超色欲天天| 久久久香港| 久99久视频| 久久久五月婷婷| 伊人玖玖精品| 色色热| 久久久九九九 99| 在线99热| 婷婷五月天激情影片| 激情久久综合网| 99碰| 开心婷婷五月天激情网| 亚洲爆乳无码精品AAA片蜜桃| 色婷婷影| 五月婷婷天| 超碰在线超碰| 97精品人人A片免费看| 成人色图情色成人网 www.5b5b5bcom 五月天| 亚洲成人av在线播放| 五月丁香视频在线观看| 天天色色天天| 婷婷精品在线| 99热1| 超碰一区二区| 岛国av电影网站| 久久久这里有精品| 西西4r午夜剧场| 思思热国产视频| 极品人妻VideOssS人妻| 亚洲日本韩国| ...婷婷国产成人亚洲日韩| 婷婷丁香五月综合激情小说| 日日夜夜婷婷| 日韩啪啪视频| 婷婷五月激情综合| 丁香五月网站| 九九这里只有精品| 日韩无码系列| 激情激情激情网| 五夜丁香| 久久色吧| 天天插天天爽| 久久久久久久11111111111| 超碰久热| 亚洲人妻av| 五月丁香色情| 狠狠干综合| 五月婷婷真爱激情网| 深爱激情五月天| 五月丁香六月色婷| 26UUU欧美激情一区二区| 热久免费视频9| 亚洲激情97五月天| 人人超碰99| 天天做天天爱天天玩夜夜爽| 五月丁香激情啪啪| 五月丁香六月欧美综合| 色色色综合色| 综合网激情五月天| 亚洲一级 片内射网站在线观看| 激情校园 亚洲| 在线成人网址| 97人妻碰碰碰久久久久-最近国语高清| 开心婷婷五| 五月婷婷丁香大陆免费| 91久久久久久| 日本熟妇乱妇熟色A片蜜桃| 美妞av| 91无码视频| 久久多色| 成人无码髙潮喷水A片| 日韩成人AV在线播放| 97色热| 影音先锋色婷婷| 五月天激情丁香| 久久的爱大香蕉| 激情综合另类| www,色婷婷| 婷婷五月丁香五月| 五月丁香久久久| 色五月丁香婷婷| 91色综合久久| 天天操狠狠操| 五月丁香综合| 色狠狠婷婷| 激情五月色播五月| 《诡秘之主》在线观看| 综合五月激情| 丁香六月啪啪| 综合久久人妻| 九月婷婷色色| se99视频| 新久久五月天激情| 激情内射人妻1区2区3区| 草美女在线观看视频在线播放| 不卡在线中文字幕无| 久色中文| 9视频1在线| 丁香五月色情| 直接看的AV| 奇米网大香蕉| 99久在线精品99re8热| 丁香婷婷少妇| 亚洲无码九九九| 综合AV在线| 热九九精品| 亚洲中文字幕av| 天天插天天日天天爽| 婷婷丁香婷婷97| 五月天啪啪啪| 丁香五月婷婷丫| 怡红院91a√| 日本啪啪网| 久热这里精品免费| 五月天激情图片| 日撸夜撸日操| 五月丁香婷婷综合在线| 99热久草| 亚洲热久| 九九综合色| 五月丁香六月天| 婷婷五月天影视网址| 成人网站av免费网站推荐| 极品少妇XXXX精品少妇偷拍| 99久在线视频| 99爱视频| 色色色综合色| 99在线精品免费视频| 日本本土色网第一区| 丁乡久久| 国产小网站| 丁香婷婷深情五月亚洲| 在线观看欧美| 蜜乳国产网站| 女人天堂av| 操99| 五月丁香成人| 五月丁香激情综合啪啪| 狠狠综合色网| 综合精品99| 99热在线精品观看| AAA久久久| 五月婷综合性中心| 激情五月丁香色婷婷| 久久久久久久久久久jjjj| 91chinese在线| 午夜丁香婷婷| 五月丁香中文| 99色1| 色综合九九| 欧美日韩aaa| 九九热精品6| 成人视频一区| 色情婷| 九九综合五月欧美| 亚洲中文字幕AV在线| 日日日日日| 天堂在线9| 天天插天天爽| 色婷婷五月综合在线| 欧美色性色好| 九九色精品| 五月丁香无码| 午夜爱爱爱成人| 激情五月亚洲综合网| 思思99久久| 九久久九精品视频| 激情五月天情色| 国产看真人毛片爱做A片| 26uuu国产| 色色五月婷| 狠狠爱婷婷爱| 99热精品无码| 亚洲精品V天堂中文字幕| 婷婷在线播放| 亚洲国产成人AV在线| 九九热99久久99| 丁香五月综合久久| 色综合色色| 五月婷激情影院| 99热黄| 婷婷丁香色性爱| avh片在线观看| 国产乱妇无乱码大黄AA片| 九九99久久精品| 丁香五月天在线| 色中色综合| 婷婷丁香五月天中文字幕| 久久五月天激情| www.色婷婷.com| 青草少妇激情| 婷婷五月天堂| 色综合五月| 五月色婷婷中文字幕| 久久这里有精品| 九九AV在线| 婷婷性爱| 亚洲情综合五月天| 国产精品色婷婷久久久精品| 久久婷婷激情四射五月天| 碰久久精品w| 无码yw| 午夜理论片最新午夜理论剧| 色久五月天| 99亚洲色色| 天天日,天天射,天天舔| 五月婷婷色色| 国产AV网页| 婷婷丁香激情综合色情| 高清无码中文字幕aVDV| 九九热经典视频在线观看| 五月天电影网| 香蕉综合网| 性爱久久| 99热国产在线| 深爱激情中文五月天av| 日本婷婷网| 99精品色| 国产精品久久久久9999小说 | 五月婷婷|欧美| 色v综合网| 婷婷永久在线| 99无码免费视频| 五月丁香婷婷欧美| 曰本久久女| 少妇综合网| 天天插天天插| 色啪影院| 五月婷婷激情综合| 波多野结衣不卡AV| 熟女乱论网| 97人人操在线| 色婷婷瘦婷婷日韩| 人妻爽爽爽久久久久久久久| 激情 婷婷| 91呦呦呦| 亚洲色色色色| 天天拍天天操| 天天摸.天天mo| 久久婷婷婷| 伦乱人妻| 婷婷六月视频| 婷婷大香焦| 丁香激惜男女| 色九九九九| 97碰碰久久| 色日本丁香婷婷| 丁香五月天黄色片| 免费日本aⅴ中文字幕| 久青操| 色婷婷五月天不卡| 2025神马午夜福利| 五月婷婷五月天天| 天天射影院| 9有码中文| 天天操婷婷| 欲求不满的人妻| 俺来也综合网精品一区| 激情伊人五月天| 色播色丁香五月| 99热综合在线| 少妇搡BBBB搡BBB搡毛茸茸 | AV成人在线网站| 丁香五月综合福利视频导航| 少妇AB又爽又紧无码网站| www.激情五月天。com| www激情com| 99只有精品| 五月婷婷久久久久| 超碰人人操| 欧美色九| 深爱激情五月婷婷| 久久性刺激| 五月天婷婷激情| 久久9久久| 欧美色色色色色色色色色色| 色色色9| 无码激情AAAAA片-区区| 婷婷五月综合激情小说| 久久男人网婷婷| 精品久久66| 九九久久高清| 婷婷性爱网| 婷婷成人综合| 久久五月婷天天干| 能看的av| 五月花综合网| 欧美色片中文字幕久久久久| 色婷婷色五月天| 婷婷久久在线| 色综合激情| 久热超碰91| se99视频| 婷婷性爱影院| 蜜乳久AV| 色播五月天激情| 九热视频免费观看| 丁香婷婷色五月| 色吧五月婷婷六月丁香| 国产SUV精品一区二区6| AV五月丁香| 亚洲人妻av伦理| 五月丁香狠狠| 在线sebiav精品视频| 九色无码| 亚洲不卡| 来吧亚洲综合网| 淫视馆aV二区一区| 色婷婷九月| 激情五月四色| 欧美在线视频9| 婷婷六月久久综合导航| 99国产这里只有精品| 97操碰视频| 婷婷五月天av| 久久久人妻门| 日韩欧美五月丁综合| 99热综合| 天天综合色| 99精品久久久| 五月天婷婷久久| 五月激情婷婷在线| 97色色色视屏| 日韩人妻在线观看| 成人短视频在线观看| 色婷婷久久综合中文久久一本| 五月婷婷另类| 2020日日干| 天天揷综合网| 丁香五月婷婷基地| 99热99热不卡| 婷婷色色综合激情| 亚洲av免费在线| 91人无码久久久久久| 九九成人| 超碰99热| 婷婷网五月天| 色五月综合网| 九九热10| 九九九九精品精| 久久九九99| 极品 少妇 内射| 天天射美女| 丁香五月天婷婷大香蕉| 99热免费在线| 色久五月天| 91人人操人人| 久久看九九90| 久久在线视频免费观看| 五月婷婷六月激情| yirenjiqingshiping| 婷婷天天插天天爱| 99热最新精品| 99亚色色色| 丁香五月之久操视频| 五月天婷婷久久| 婷婷色丁香五月| 色婷婷日本| 直接看的AV| 99热亚洲精品66| 婷婷丁香五月天狠狠| 精品久久人妻热| 色久婷婷五月| 五月激情六月| 99在线资源| 91疯狂操操操操| 激情国产五月| 婷婷五月性感| 99九九99九九九视频精品| 色五月欧美| 亚洲日日日| 夜夜撸日日操| 久久99成人性爱高清视频| 丁香五月婷婷色五月| 丁香久久综合| 97干在线视频| 亚洲综合激| 91精品熟女| 亚洲看av的网站| 婷婷五月AV| 新久久五月天激情| 五月婷婷三级| 久久只有这里精品免费| 夜色综合网| 九九伦子片| 99精品偷自拍| AA丁香综合激情| 99噜噜噜在线播放| www.婷婷五月.com| 久久久亚洲精品一区二区三区浴池| 色婷婷免费观看| 天天爱天天狠天天透| 91精品国产99久久久久久天美| 日日狠狠久久偷偷四色综合免费| 亚洲一区先锋影音| 自拍盗摄 另类| 色婷婷在线视频| 欧美久热| 99精品热视频| 亚洲第一成人无码A片| 色综合伊人网| 久久这里只有精品热在99| 精品夜夜澡人妻无码AV| 亚洲啪啪自拍| 丁香婷婷久久 | 免费国产VA国产免费| www.日日夜夜| 婷婷五月天网址| 五月丁香综合网| 九九这里都是精品| 午夜伊人大香蕉| 91久久久久久久久久| 人妖色AV色综合| WWW,激情五月天,COM| 日本va视频| 五月天丁香综合久久国产| 婷婷久久五月天| 丁香五月色情| 超碰日韩成人| 超碰人人操人人干| 婷婷六月丁香激情| 五月久久噜噜| 大地资源色婷婷视频在线| 亚州操操| 色呦呦在线| 丁香婷最新动态| 可似看的AV| 色五月综合网| 99九无网码| 日日狠夜夜狠| 五月天婷婷久久| 激情五月丁香六月综合AVXXXX| 色色色五月婷| 五月丁香激情深爱婷婷| 丁香六月婷婷综合| 3p久久| 99.色| 婷婷伊人网| 97色97干| 亚洲va在线∨a天堂va欧美va| 久热超碰| 久久五月天 91| 十月丁香婷婷| 天天做天天摸| 五月婷婷性爱| 成人免费黄色短视频| 色五月首页| 激情五月婷婷伊人| 99视频只有精品| www.五月丁香| PORNY九色9l自拍视频成人| 五月婷婷激情久久| 久久91久久精品久久| 夜夜人妻五月天| 激情九月综合| 色五月丁香A欧美com | 五月天中文网| 蜜桃人妻无码AV天堂三区| 第四色色六月色综合| 性爱网五月天| 久艹大香蕉| 久久er99热精品一区二区| 天天做天天爱天天爽夜夜揉| 欧美人人操| 婷婷色色亚洲| 久久综合丁香五月| 色五月婷婷久久| 99啪| 色五月激情网| 99久久九九| 色欲av伊人久久大香线蕉影院 | 天天天干夜夜夜操| 99碰碰中文| 激情婷婷亚洲五月| 男人天堂99| Av九九| 亚洲第79页| 五月丁香亭亭A片| 天天日日夜夜爽。| 亚洲视频另类| 日日撸天天干| 99热在线中出| 亚洲无码色色| 亚洲狠狠色丁香婷婷综合久久| caopeng97日韩| 亚洲国产精品成人午夜| 99思思热只有在这里看| 色色色色色九九九九九| 婷婷五月蜜桃成人桃色丁香| 亚洲六月色婷婷| 亚洲人妻Av| 久热网在线视频| 色天堂操| 色碰碰视频| 综合久久六月| 五月天久久网站| 影音先锋91网站在线观看| 亚洲 五月 婷婷 成人| 久久婷鲁| 天天射天天射一道本日本社区 | 91丁香五月| 精品五月天| 91色吧网| 五月欧美丁香在线观看| 色三级色三级| 婷婷成人视频| 五月天激情婷婷丁香| 超碰v| 激情亚洲网| 另类综合激情| 丰满少妇猛烈A片免费看观看| 婷婷五月天国产精品| 精品一区二区三区免费毛片爱| 久久九九大香蕉电院| 99热销国产这里有精品| WWW,激情五月天,COM| 国产婷伊人| 97操碰在线视频| 大香蕉久久伊人婷婷五月丁香| 成人网站免费在线播放| 久久婷婷五月天蜜桃| 婷婷情爱五月天6| 99久久久| 2021日韩无码| 96丁香六月婷婷蜜桃综合久久| 中文网AV| 国产色色小草视频| 婷婷深爱五月| 久久在线92| 女人高潮内射99精品| 99色精品| 五月婷婷久久综合| 丁香五月欧美色综合| 五月婷婷深深爱| 久久婷婷五月丁香网| 一本大道嫩草AV无码专区| 99在线视频免费| 五月丁香六月婷婷不卡免费无码| 99人妻碰碰久久久禁片| 丁香五月av在线| 日本九九九九| 欧美激情综合色综合啪啪五月| 精品视频99看在线视频| 亚洲精品在线视频| 大香蕉九九| 丁香婷婷色| 99色干| 日日夜夜狠狠| 丁香五月色五月| 五月丁香六月香综合激情| 第四色大香蕉| 碰超亚洲| 中文字幕日产A片在线看| 噜噜噜噜在线| 五月天激情综合首页| 亚洲XX网| 色色999三级片| 婷婷97碰碰| 五月婷婷五月丁香综合| 日本三久久| 欧美精品XXXXBBBB| 婷婷伊人网| 99热综合网| 桃色五月婷婷| 黄色成人网站在线播放| 六月婷婷青青青视频| 懂色av粉嫩av蜜臀av| 五月天婷婷基地| 99热这里全是精品| 亚洲成人va| 日本三级中国三级99| 成人av在线网| 国产成人精品一区二三区熟女在线| 99热在线观看精品免费| 色婷婷小说| 综激情网| 婷婷不卡基地| 激情深爱五月天| 丁香六月在线| 五月色网| 色情五月丁香| 五月丁香激情婷婷| 人妻VideOssS人妻高清| 久久婷婷亚洲五月天| 日本3级片偷拍网站| 丁香av网| 久久这里只有精品视频15| 婷婷丁香18| 91九色超碰| 激情涩播| 影院久久久| 色99免费视频中文| 婷婷的色色五月天| 五月天激情网址| 久久婷婷免费| 色亭亭九月| 国产乱妇无乱码大黄AA片| 五月丁香激情综合网| 在线观看av网站| 成人网站免费在线播放| 日韩成人电影AV| 综合色播| 超碰人人操在线| 九九热99热| 婷婷五月丁香综合激情| 伊人久久五月天综合| 国产婷婷五月色情综合| 99热最新网址| 亚洲成色综合网站免费观看| 99精品在| 五月婷婷丁香在线| 色五月涩涩婷婷| 五月丁香六月婷婷在线观看| 夜夜干夜夜操| 五月婷婷之美女图片| 色情五月天se| 五月婷精品| 久久婷婷亚洲五月天| 日日爽日日爽| www.91操| 国产真人做爰视频免费| 亚洲精品九九| 99爱在线| 99人碰碰碰| 伊人网大香| 久久99热这里| 人人爱国产| 婷婷五月视屏| 99热激情| 婷婷成人视频| av网站免费在线| 久久99久久99精品免观看粉| 亚洲综合网激情小说| 五月激情天天干| 色99网| 午夜五月天| 1024操逼| 丁香五月婷婷AV| 五月色欧洲| 夜色综合网| 亚洲国产精品二二三三区| 欧美成人精品A片免费一区99| 无码人妻丰满熟妇奶水区码| 区啪精品| 香蕉狠狠爱视频| 26uuu亚洲色| 丁香六月狠狠干| 97精品人人A片免费看| 丁香婷婷超碰 | 99视频在线观看视频| 人妻在线中文字幕久久| 日韩在线99| 黄桃AV无码免费一区二区三区| 婷婷五月丁香青青草在线| 色狠狠综合网| 久 久9 9 热 视 频| 99热都是精品| 中文字幕 中文字幕明步| 婷婷丁香五月天影院 | 五月天婷婷基地| 91丁香综合| 99在线热| 天天干夜夜谢| 五月丁香色色网| av五月丁香婷婷网| 激情综合网五月婷婷| 婷婷五月天在线观看第二页| 天天干天天操天天射| 国产亚洲精品久久久久苍井松| 91色综合网| 毛片色五月| 午夜不卡久久精品无码免费| 综合啪啪| 色五月综合| 蜜乳AV成人| se99在线| 九九成人视频| 亚洲区1| 91久久久久久| 成人免费在线电影| 一本大道嫩草AV无码专区| 91综合网| 99在线精品视频免费| 2020日日干| 婷婷五月天激情网| 玖玖在线视频| 六月丁香久久| 婷婷五月五月丁香| 九九99免费视频| 极品另类| 婷婷欧美激情| 亚洲色网络| 中文字幕高清av| 欧美激情综合色综合色| 日本色色网| 色伊人婷婷| 超碰免费大香蕉| 99九九视频| 思思99热| 久久婷婷五月综合色欧美| 婷婷爱综合| 日本色色色| 爆乳熟女一区二区三区爆乳| 色色a| 色五月婷婷综合在线| 欧洲色色| 超碰在线99热| 丁香月六月| 97超喷视频在线观看| 久久久久久久久久人妻| 91色性感五月婷婷丁香| www.粉嫩av.com| 第四色五月天| 天天爱天天日| AV在线免费播放| 五月婷婷六月丁香综合| Av大香蕉| 五月天久久网站| 99re在线这里只有精品视频首页| 亚洲一级 片内射网站在线观看| 99综合视频一体| 天天色天天色天天色天天色天天色天天色| 久久人妻人人| 丁香五月激情综合久久| 日韩一区二区三区无码| 99热超碰在线| 色吧五月婷婷| 99热在线只有精品| 九九AV在线| 久久人妻精品| 久草大| 成人网在线视频| 久久99精品久久久| 五月婷婷丁香综合| 婷婷五月天综合AV| AAA久久| 久久久久激情| 国产9色在线/日韩| 久久丁香婷婷五月天| 婷婷色情 | 日本ww亚洲| 婷婷中文综合网| 五月婷婷伊人在线| 天天操五月天| 99热精品在线| 综合玖玖偷拍| 99re思思久久| 国产性色蜜乳| 97超碰在线免费观看| 成年人最刺激的综合网| 色五月婷色彩免播放器| 亚洲视频99| 五月丁香花免费视频| 操逼巨乳91| 性爱综合网| 精品综合久久久久久五月天| 人人艹艹艹| 婷婷五月天亚洲五码| 婷婷久久欧美| 嘿嘿视频免费看9| 啪啪小说五月天| 在线不卡视频| 日本丰满久久| 六月婷婷八月丁香| 99免费热在线精品| 人操人| 黄色一级影片| 婷婷五月天AV| 天天天天天色| 大伊香蕉玖玖爱| 色综合天天| 无码橾| 亚洲综合婷婷五月| 99热大香蕉| 五月综合久久| 六月丁香网| 玖玖综合色| 97自拍视频网| 久操福利| 啪到高潮激情丁香五月| 五月婷丁香花| 五月丁香在线观看99| 亚洲五月六月婷婷| 婷婷五月天激情电影小说| 色色丁香婷婷综合| 色婷婷小说| 日本熟妇精品99| 直接看的AV网站| 婷婷丁香五月天影院| 婷婷综合性爱网| 26uuu国产| 五月丁香六月婷婷玖玖| 五月天婷婷激情网| 思思热视频| 热99精品视频| 色综合色五月| 激情图片99| 婷婷五月成人社区| 国产毛片欧美毛片久久久| 久久久久久久久久8888| 天天做天天爰天天爽天天无遮挡| WWW99热| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 天天干天天拍| 久久色五月天激情小说| 婷婷伊人激情婷婷| 婷婷月五天在线在线看| 色天堂A| 欧美日本免费一道免费视频 | 亚洲综合色色| 亭亭五月丁香五月天激情| AV色五月婷婷| 亚洲激情Av| 97碰碰草| 久99婷婷色综合| 国自产拍偷拍精品啪啪一区二区| 99热亚洲| 九九视频在线| 丁香五月Av| 天天狠狠干| 国产三级秋霞| 亚洲综合色棒| 婷婷五月天色丁香| 伊人春天av| 91久久电影| 精品成人在线| 51精品国自产在线| 99免费| 无码任你操| 91精品久久久久、久五月天| 久久伊人日日夜夜| 99热啪啪| 开心婷婷中文字慕| 丁香婷婷人妻| 新久久五月天激情| 激情婷婷五六月天| 婷婷五月俺要去| 色五月婷婷视频| 亚洲婷婷成人五月天| 激情丁香婷婷六月天| 免费国产视频| 婷婷丁香黄色| 婷婷五月丁香综合网| 精品AV无码超碰| 色偷偷AV亚洲男人的天堂| 大伊香蕉精品视频在线| 婷婷色色网站| 国产日韩精品SUV| 一区二区三区四日本| 99熟女| 狠狠婷婷综合| 色综合久网| 丁香社92视频| 日本久久超碰| 色综合狠狠色| 激情五月九九九| 97人人搞| 开心五月激情| 亚洲色99| 大伊香蕉精品视频在线| 超碰97在线观看免费| 色香久久| 日本99色| 99精品久久| 亚洲无码成人性爰网| 99在线观看精彩视频| 亚洲激情无码久久| 五月天日日操夜夜操 | 欧美韩国日本| 99久久婷婷国产综合精品草原| 青草五月天| 丰满少妇猛烈A片免费看观看 | 99久久亚洲精品视频| 激情婷婷丁香色五月综合| 久99热| 92久久| 五月婷婷三级| 丁香色婷婷| 牛牛热这里只有jingpin| 三级片AAA久久久AAA久久久AAA| 五月天丁香啪啪啪啪| 在线视频你懂得| 日本va视频| 91九色中文字幕女在线观看| 99热这里只有精品8| 成人短视频免费| 九月婷婷综合网| 这里只有视频精品| 色五月天综合网| www.日本91| 在线理论片| 色综合丁香婷婷| 欧美色小说婷婷| 五月开行婷婷色五月| 五月天婷婷在线AN| 日日操天天操| 伊人婷婷色| 五月天艹天天| 99热九九热| 91xxxx九色| 能看的av片| 性爱网五月天| 色综合婷婷| 色五月婷婷青娱乐| 亚洲色欲欧美一区二区三区| 九九99热久久精品66中文字幕| 色综合久久888| 成人综合网站| 婷婷在线综合| 亚洲狠狠干| 丁香婷婷大香蕉| 97碰操| www.五月天。com| 人人摸人人搞| 五月天开心色色网| 色www.con| 九九人妻福利| 五月天操逼网| 色婷婷成人久久| 丁香色色网| 色99在线| 九一九九黄色| 日本一级黄色电影| 成人免费在线电影| 九九色情网五月天| 色五月五月天| 久久小视频| jiujiu热在线视频| www.五月婷婷.com| 狠狠久久婷婷| 婷婷成人视频| 日本色99网站| 日韩成人精品中文字幕| 天天色,天天日,天天做| 久久五月丁香| 大香蕉伊人丁香五月| 色五月久久成人婷婷| 五月亭亭直播| 亚洲美女高潮久久久久久69| 七七九色| 五月丁小婷婷激情四射| 色色色视频| 日本九九九九| 六月丁香花婷婷| 婷婷综合激情| 久久婷婷五月综合色天| 天天射夜夜爽| 色婷婷综合影院| 停停综合色色| 日韩成人精品一区久久久久| 久久综合干| 好激情在线综合网| 五月天婷婷色综合| 日本人妻操| 五月综合亚洲| 九九热在线99| 婷婷六月丁香激情| 成人丁香五月| 人人爽人人射-美女久久久久久久久久-成人AV| 夜夜干夜夜操| ..真实国产乱子伦对白在线_欧 | 五月婷婷综合性爱噜噜| 性爱视频99| 免费视频WWW在线观看网站| 97人人干| 99在线观看精品| 日韩无码成人电影|