免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

Qt QUdpSocket UDP通信Demo:局域網(wǎng)廣播組播與設(shè)備發(fā)現(xiàn)實(shí)踐

Qt QUdpSocket UDP通信Demo:局域網(wǎng)廣播組播與設(shè)備發(fā)現(xiàn)實(shí)踐 簡介面向具備一定 C 基礎(chǔ)、希望掌握 Qt 網(wǎng)絡(luò)編程的開發(fā)者這套 QTUDP 通信示例圍繞 UDP 無連接、低開銷、低延遲的特點(diǎn)演示客戶端與服務(wù)端之間的數(shù)據(jù)報(bào)收發(fā)可用于音視頻流、實(shí)時(shí)控制等場(chǎng)景的入門驗(yàn)證。壓縮包共 12 個(gè)文件約 10KB含 4 個(gè) cpp、2 個(gè) h 源代碼及 2 個(gè) ui 界面文件另有 2 個(gè) pro 工程配置和 2 個(gè) user 用戶配置便于導(dǎo)入 Qt Creator 對(duì)照運(yùn)行。資源已有 823 人學(xué)習(xí)讀者可借此理解 QUdpSocket 的端口綁定、數(shù)據(jù)報(bào)發(fā)送與接收、readyRead 信號(hào)處理及基礎(chǔ)錯(cuò)誤檢查并梳理輕量 UDP Demo 的工程組織方式為后續(xù)擴(kuò)展多線程收發(fā)、編解碼與穩(wěn)定性處理打基礎(chǔ)。1. 局域網(wǎng)里那點(diǎn)事用 QUdpSocket 其實(shí)很短剛上手 Qt 網(wǎng)絡(luò)模塊的人往往是在一個(gè)局域網(wǎng)小工具里第一次碰到 QUdpSocket上位機(jī)要同時(shí)給十幾臺(tái)下位機(jī)推配置用 TCP 得為每臺(tái)維護(hù)一條連接、處理斷線重連換成 UDP 之后一次 writeDatagram 就把包扔出去了。這份 QTUDP通信Demo 就是這類需求的骨架它沒把協(xié)議做全而是把 Qt 下 UDP 通信的完整路徑攤開套接字初始化、端口綁定、數(shù)據(jù)報(bào)收發(fā)、廣播與組播以及在 readyRead 信號(hào)里把裸字節(jié)還原成業(yè)務(wù)消息。適合三類人剛上手 Qt 想找個(gè)能直接編譯運(yùn)行的起點(diǎn)、做過 TCP 被粘包和多連接折騰過、需要在局域網(wǎng)做設(shè)備發(fā)現(xiàn)和狀態(tài)上報(bào)。它真正回答的不是“怎么寫一個(gè) UDP 程序”而是“UDP 這一層在你的工程里該長什么樣”。2. 工程結(jié)構(gòu)與技術(shù)選型三層拆分讓網(wǎng)絡(luò)代碼能離開界面活著一個(gè)能直接編譯的 Demo最容易寫壞的恰恰是結(jié)構(gòu)。所有邏輯塞進(jìn) MainWindow 的槽函數(shù)里二十行能跑通等到要加心跳、加廣播、加文件分片界面類會(huì)膨脹到八百行想抽出來復(fù)用的時(shí)候發(fā)現(xiàn)到處是 ui- 指針。這個(gè) Demo 的價(jià)值一半在收發(fā)本身另一半在它把“界面”“網(wǎng)絡(luò)”“協(xié)議”這三件事拆開了。2.1 目錄拆分界面、協(xié)議、網(wǎng)絡(luò)各管一攤我一般會(huì)把這類項(xiàng)目擺成下面這個(gè)樣子src 下按職責(zé)分目錄而不是按文件類型分目錄QTUdpDemo/ ├── QTUdpDemo.pro qmake 工程文件 ├── CMakeLists.txt CMake 構(gòu)建Qt6 優(yōu)先 ├── src/ │ ├── main.cpp │ ├── ui/ │ │ ├── mainwindow.h │ │ ├── mainwindow.cpp 只負(fù)責(zé)輸入框、按鈕、日志展示 │ │ └── mainwindow.ui │ ├── net/ │ │ ├── udpreceiver.h 綁定端口、收包、拋信號(hào) │ │ ├── udpreceiver.cpp │ │ ├── udpsender.h 組包、發(fā)送、解析目標(biāo)地址 │ │ └── udpsender.cpp │ ├── proto/ │ │ ├── packet.h 協(xié)議頭結(jié)構(gòu)體與常量 │ │ └── packet.cpp 打包 / 解包 / 校驗(yàn) │ └── model/ │ └── peerlist.h 在線對(duì)端列表IP、端口、最后活躍時(shí)間 └── res/ └── icons.qrcnet 層只認(rèn) QByteArray 和 QHostAddress不 include 任何界面頭文件proto 層只做字節(jié)層面的打包解包純函數(shù)可以單獨(dú)寫單元測(cè)試ui 層拿到的是已經(jīng)解析好的消息對(duì)象。這條邊界守住之后后面換成命令行程序、換成無界面服務(wù)net 和 proto 一行都不用改。這是我在自己項(xiàng)目里踩出來的規(guī)矩網(wǎng)絡(luò)層只要開始 emit 帶 QString 的“已經(jīng)格式化好的日志”基本就廢了它會(huì)被界面需求牽著走。具體到類的職責(zé)UdpReceiver 持有 QUdpSocket、負(fù)責(zé) bind 和 readyRead 槽UdpSender 持有另一個(gè) QUdpSocket負(fù)責(zé) writeDatagram 和發(fā)送失敗的 errorString 上報(bào)Packet 提供 encode/decode 兩個(gè)靜態(tài)方法返回一個(gè)可選的業(yè)務(wù)消息結(jié)構(gòu)。PeerList 用 QHashQString, PeerInfo 存活躍對(duì)端key 用 “ip:port”定時(shí)器掃過期。這幾個(gè)類加起來不到五百行但每一塊都能單獨(dú)拎走。2.2 QUdpSocket 的能力邊界以及 Qt5 與 Qt6 的差異選 QUdpSocket 而不是裸 socket理由很實(shí)際它把 Qt 的事件循環(huán)接上了readyRead 信號(hào)天然和界面線程同頻不需要自己寫 select 循環(huán)也不需要處理 EINTR??缙脚_(tái)方面 Windows 的 Winsock 初始化和 Linux 的 socket 選項(xiàng)差異都被抹平了。代價(jià)是它只暴露 UDP 的傳輸層能力不幫你做任何可靠性保證這一點(diǎn)必須提前想清楚。維度QUdpSocketQTcpSocket連接模型無連接每次帶目標(biāo)地址先 connect之后只寫數(shù)據(jù)消息邊界一條數(shù)據(jù)報(bào)就是一條消息流式需要自己切包送達(dá)保證不保證到達(dá)、不保證順序保證有序到達(dá)單包上限約 65507 字節(jié)受 MTU 影響更小無上限典型場(chǎng)景設(shè)備發(fā)現(xiàn)、狀態(tài)上報(bào)、音視頻幀文件傳輸、命令通道Qt5 和 Qt6 在這塊 API 上的差異不大但有三個(gè)點(diǎn)要注意。第一QNetworkDatagram 是 Qt 5.8 才有的如果工程要兼容更老的版本接收側(cè)只能退回 readDatagram(char*, qint64, QHostAddress*, quint16*)。第二錯(cuò)誤信號(hào)在 Qt 5.15 之前叫 error(QAbstractSocket::SocketError)5.15 起改名為 errorOccurredQt6 里只有后者寫 connect 的時(shí)候要么按版本做條件編譯要么直接用舊名字去連。第三Qt6 的 CMake 側(cè)需要用 qt_add_executable 和 qt_standard_project_setupqmake 的 .pro 則幾乎原樣能編。提示如果從 Qt5 工程遷到 Qt6先看 QTextCodec 相關(guān)的代碼Qt6 把它挪到了 core5compat 模塊而 UDP 本身的收發(fā)邏輯一般不需要改。2.3 兩份構(gòu)建配置.pro 與 CMakeListsqmake 那份是給習(xí)慣 Qt Creator 直接打開的人準(zhǔn)備的四行就夠QT core gui widgets network CONFIG c17 TARGET QTUdpDemo TEMPLATE app SOURCES src/main.cpp src/ui/mainwindow.cpp src/net/udpreceiver.cpp \ src/net/udpsender.cpp src/proto/packet.cpp HEADERS src/ui/mainwindow.h src/net/udpreceiver.h \ src/net/udpsender.h src/proto/packet.h FORMS src/ui/mainwindow.ui關(guān)鍵就在 QT network 這一行沒有它鏈接階段會(huì)報(bào) QUdpSocket 未定義。CMake 那份對(duì)應(yīng) Qt6cmake_minimum_required(VERSION 3.16) project(QTUdpDemo LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) # 有 Q_OBJECT 的類必須開 find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network) qt_standard_project_setup() qt_add_executable(QTUdpDemo src/main.cpp src/ui/mainwindow.cpp src/net/udpreceiver.cpp src/net/udpsender.cpp src/proto/packet.cpp ) target_link_libraries(QTUdpDemo PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network)參數(shù)上要留意 find_package 里的 Network 組件少寫一個(gè)就是編譯期找不到 QUdpSocket 頭文件。CMAKE_AUTOMOC 必須為 ON否則自定義類里繼承 QObject 的 Q_OBJECT 宏不會(huì)被處理鏈接時(shí)報(bào) vtable 未定義這個(gè)錯(cuò)誤提示對(duì)新手極不友好是典型的入門翻車點(diǎn)。Qt5 用戶把 Qt6:: 換成 Qt5::、find_package 里寫 Qt5 即可qt_add_executable 換成普通的 add_executable。3. 核心鏈路拆解從 bind 到 readyRead 的一次完整收發(fā)結(jié)構(gòu)擺好之后真正要讀透的是那一兩百行網(wǎng)絡(luò)代碼。UDP 的收發(fā)在 Qt 里被壓縮成了四五個(gè)函數(shù)但每個(gè)函數(shù)的參數(shù)都藏著坑尤其 bind 和 receiveDatagram 的參數(shù)含義寫法上差一點(diǎn)行為就差很遠(yuǎn)。3.1 構(gòu)造與綁定地址、端口和 BindMode 三件事接收端必須綁固定端口否則對(duì)端不知道往哪發(fā)。構(gòu)造函數(shù)里就該把 bind 和信號(hào)連接做完避免對(duì)象構(gòu)造成功但實(shí)際不可用的半殘狀態(tài)// src/net/udpreceiver.cpp UdpReceiver::UdpReceiver(quint16 port, QObject *parent) : QObject(parent) , m_socket(new QUdpSocket(this)) { // AnyIPv4 表示監(jiān)聽本機(jī)所有 IPv4 網(wǎng)卡用 Any 會(huì)同時(shí)嘗試 IPv6 const bool ok m_socket-bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); if (!ok) { qWarning() bind port failed: m_socket-errorString(); return; // 后續(xù) readyRead 不會(huì)觸發(fā)調(diào)用方需檢查 isListening() } connect(m_socket, QUdpSocket::readyRead, this, UdpReceiver::onReadyRead); } bool UdpReceiver::isListening() const { return m_socket-state() QAbstractSocket::BoundState; }參數(shù)逐個(gè)說。第一個(gè)參數(shù)是監(jiān)聽地址寫 QHostAddress::AnyIPv4 會(huì)綁到 0.0.0.0廣播和組播都能收寫成某個(gè)具體網(wǎng)卡地址就只有那塊網(wǎng)卡收得到本機(jī) 127.0.0.1 發(fā)來的包會(huì)被丟掉——這是“本機(jī)能發(fā)不能收”最常見的原因。第二個(gè)參數(shù)是端口0 表示讓系統(tǒng)分配但接收端絕不能用 0。第三個(gè)參數(shù)是 BindMode默認(rèn)值 DefaultForPlatform 在 Linux 上對(duì)應(yīng)獨(dú)占兩個(gè)進(jìn)程先后綁同一端口時(shí)第二個(gè)直接失敗加上 ShareAddress | ReuseAddressHint 之后同一臺(tái)機(jī)器上跑兩個(gè)實(shí)例調(diào)試才不會(huì)互相打架。工程上允許重復(fù)綁定是為了調(diào)試方便正式部署時(shí)一個(gè)端口只應(yīng)該有一個(gè)接收者。3.2 發(fā)送路徑writeDatagram 的返回值能告訴你什么發(fā)送端不一定要 bind因?yàn)?sendto 時(shí)內(nèi)核會(huì)自動(dòng)分配源端口。但如果對(duì)端會(huì)回包就必須 bind 一個(gè)固定端口否則回包打到隨機(jī)端口上沒人收。發(fā)送邏輯本身很短難的是目標(biāo)地址的解析// src/net/udpsender.cpp qint64 UdpSender::sendText(const QString text, const QHostAddress to, quint16 port) { QByteArray packet Packet::encode(Packet::TypeText, text.toUtf8()); const qint64 written m_socket-writeDatagram(packet, to, port); if (written ! packet.size()) { // UDP 下要么整包寫入要么 -1出現(xiàn)部分寫入說明包超長 qWarning() send failed, want packet.size() got written m_socket-errorString(); } return written; } bool UdpSender::sendTextToHost(const QString text, const QString host, quint16 port) { QHostAddress addr; if (!addr.setAddress(host)) { // 先按 IP 字面量解析 // 域名解析是阻塞的示例里放主線程真實(shí)項(xiàng)目應(yīng)換成 lookupHost 異步版 const QHostInfo info QHostInfo::fromName(host); if (info.error() ! QHostInfo::NoError || info.addresses().isEmpty()) { return false; } addr info.addresses().first(); } return sendText(text, addr, port) 0; }writeDatagram 的返回值是實(shí)際寫入的字節(jié)數(shù)UDP 語義下它只有兩種結(jié)果等于數(shù)據(jù)報(bào)長度或者 -1。如果出現(xiàn)“小于包長”的返回值通常意味著數(shù)據(jù)報(bào)超過了協(xié)議棧允許的上限IPv4 下大約 65507 字節(jié)或者是緩沖區(qū)瞬間被打滿。返回值不是 -1 就以為發(fā)成功了是個(gè)常見的錯(cuò)覺——UDP 發(fā)送成功只代表數(shù)據(jù)交給了內(nèi)核不代表對(duì)方收得到這一點(diǎn)在后面心跳和重傳設(shè)計(jì)里會(huì)再提。3.3 接收路徑readyRead 只說明“至少有一個(gè)包”readyRead 的語義是“有數(shù)據(jù)可讀”不是“你的消息到了”所以槽函數(shù)里一定要用 while 循環(huán)把緩沖區(qū)讀空否則剩下的包要等下一次數(shù)據(jù)到達(dá)才觸發(fā)信號(hào)// src/net/udpreceiver.cpp void UdpReceiver::onReadyRead() { while (m_socket-hasPendingDatagrams()) { const qint64 size m_socket-pendingDatagramSize(); if (size 0) { break; } QNetworkDatagram dg m_socket-receiveDatagram(static_castint(size)); if (!dg.isValid()) { continue; } const Packet::Message msg Packet::decode(dg.data()); if (!msg.valid) { qWarning() drop malformed packet from dg.senderAddress().toString(); continue; // 臟包直接丟棄不要讓異常數(shù)據(jù)進(jìn)業(yè)務(wù)層 } emit messageReceived(dg.senderAddress().toString(), dg.senderPort(), msg); } }三個(gè)函數(shù)的關(guān)系要理清hasPendingDatagrams 判斷隊(duì)列里還有沒有pendingDatagramSize 返回隊(duì)首那個(gè)包的長度receiveDatagram 按給定長度取出并返回一個(gè) QNetworkDatagram里面同時(shí)帶 senderAddress、senderPort 和 data。傳參時(shí)把 pendingDatagramSize 的結(jié)果原樣傳進(jìn)去不要圖省事傳一個(gè)大值否則可能把后面的包截?cái)?。emit 出去的是已經(jīng)解包并校驗(yàn)過的結(jié)構(gòu)體界面層只負(fù)責(zé)展示不做字節(jié)操作。3.4 應(yīng)用層協(xié)議給每個(gè)數(shù)據(jù)報(bào)加個(gè)頭UDP 保留了消息邊界所以不需要像 TCP 那樣處理粘包。但實(shí)際項(xiàng)目里仍有兩種情況需要自己定協(xié)議一是同一個(gè)端口上要區(qū)分文本、心跳、文件塊等多種消息二是單條業(yè)務(wù)消息可能超過 MTU。這個(gè) Demo 里我用一個(gè)固定八字節(jié)的頭來解耦字段類型字節(jié)數(shù)說明magicquint162固定 0x5154快速識(shí)別是不是本程序的包versionquint81協(xié)議版本方便后續(xù)兼容typequint811 文本 2 心跳 3 文件塊seqquint324遞增序號(hào)僅用于日志和丟失統(tǒng)計(jì)payloadSizequint324負(fù)載字節(jié)數(shù)用于校驗(yàn)// src/proto/packet.cpp QByteArray Packet::encode(quint8 type, const QByteArray payload) { QByteArray out; QDataStream s(out, QIODevice::WriteOnly); s.setByteOrder(QDataStream::BigEndian); // 網(wǎng)絡(luò)字節(jié)序跨平臺(tái)必須顯式指定 s.setVersion(QDataStream::Qt_5_15); // 兩端版本要一致否則 QString 序列化格式不同 s quint16(0x5154) quint8(1) type quint32(m_seq) quint32(payload.size()); out.append(payload); return out; }參數(shù)上有兩個(gè)必須顯式設(shè)定的東西字節(jié)序和 QDataStream 版本號(hào)。默認(rèn)字節(jié)序在小端機(jī)器上是 LittleEndian接收方如果是大端設(shè)備就全亂QDataStream 的版本決定了 QString 等類型的序列化格式兩端不一致時(shí)讀出來的長度字段都是錯(cuò)的。負(fù)載部分直接用 append 塞原始字節(jié)不經(jīng)過 QDataStream避免二次編碼帶來的額外開銷。單包建議控制在 1400 字節(jié)以內(nèi)這個(gè)數(shù)和以太網(wǎng) MTU 1500 減去 IP 頭 20 字節(jié)、UDP 頭 8 字節(jié)后的余量有關(guān)超過就要自己分片加序號(hào)重組那是另一個(gè)話題了。4. 廣播、組播與對(duì)端發(fā)現(xiàn)一份代碼覆蓋三種投遞方式單播只能發(fā)給一個(gè)已知地址但設(shè)備發(fā)現(xiàn)這類需求是一對(duì)多的Demo 里把廣播和組播都放進(jìn)來正是因?yàn)樗鼈z是局域網(wǎng)場(chǎng)景下最省事的發(fā)現(xiàn)手段。4.1 廣播setBroadcast 與子網(wǎng)邊界廣播的寫法幾乎是單播加一行開關(guān)// 發(fā)送端允許廣播 m_socket-setBroadcast(true); QByteArray probe Packet::encode(Packet::TypeHeartbeat, QByteArray()); // QHostAddress::Broadcast 等價(jià)于 255.255.255.255 m_socket-writeDatagram(probe, QHostAddress::Broadcast, 45454);這里有兩個(gè)容易翻車的點(diǎn)。其一不調(diào)用 setBroadcast(true) 直接往廣播地址發(fā)writeDatagram 會(huì)返回 -1錯(cuò)誤信息是“Permission denied”之類的措辭看著像權(quán)限問題實(shí)際是套接字沒開廣播選項(xiàng)。其二255.255.255.255 只在本地子網(wǎng)內(nèi)有效路由器不會(huì)轉(zhuǎn)發(fā)跨網(wǎng)段必須用子網(wǎng)定向廣播地址比如 192.168.1.255而且要提前算好掩碼。接收側(cè)就更簡單了只要 bind 的是 AnyIPv4 的對(duì)應(yīng)端口廣播包會(huì)正常觸發(fā) readyReadsenderAddress 拿到的是發(fā)送方的實(shí)際 IP。真要用廣播做設(shè)備發(fā)現(xiàn)節(jié)奏上建議“上電連發(fā)三次、間隔 300 毫秒”而不是一直刷。廣播包會(huì)被同一網(wǎng)段所有機(jī)器收到頻率高了純屬干擾別人。發(fā)現(xiàn)到對(duì)端之后立刻轉(zhuǎn)成單播繼續(xù)通信廣播只用在“我還不知道你是誰”的階段。4.2 組播joinMulticastGroup 與網(wǎng)卡選擇組播比廣播克制只有加入了同一個(gè)組地址的進(jìn)程才收得到。組地址范圍是 224.0.0.0 到 239.255.255.255其中 224.0.0.x 段被協(xié)議保留實(shí)際項(xiàng)目里習(xí)慣用 239.x.x.x// 接收端綁定任意地址后加入組播組 QUdpSocket *mc new QUdpSocket(this); mc-bind(QHostAddress::AnyIPv4, 45455, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); bool joined mc-joinMulticastGroup(QHostAddress(239.255.43.21)); if (!joined) { qWarning() join multicast failed: mc-errorString(); } // 發(fā)送端組播包的 TTL 一般設(shè)小一點(diǎn)避免被路由器轉(zhuǎn)出本網(wǎng)段 QUdpSocket *ms new QUdpSocket(this); ms-setSocketOption(QAbstractSocket::MulticastTtlOption, 1); ms-writeDatagram(payload, QHostAddress(239.255.43.21), 45455);綁定地址寫 AnyIPv4 是必須的寫具體網(wǎng)卡地址在某些平臺(tái)上會(huì)讓 joinMulticastGroup 失敗。多網(wǎng)卡機(jī)器上筆記本同時(shí)開著有線和無線很常見joinMulticastGroup 的第二個(gè)參數(shù)可以指定 QNetworkInterface否則包可能從錯(cuò)誤的網(wǎng)卡出去。TTL 設(shè) 1 表示只在本網(wǎng)段傳播這是局域網(wǎng)發(fā)現(xiàn)業(yè)務(wù)里最合理的值。判斷網(wǎng)卡是否選對(duì)可以遍歷 QNetworkInterface::allInterfaces() 打印每個(gè)接口的 flags看哪個(gè)帶 IsUp 和 IsRunning。4.3 心跳與在線列表用 QTimer 維護(hù)對(duì)端狀態(tài)UDP 沒有連接狀態(tài)對(duì)端什么時(shí)候下線你完全不知道所以在線列表只能靠心跳推出來// src/model/peerlist.cpp void PeerList::onHeartbeat(const QString ip, quint16 port) { const QString key QString(%1:%2).arg(ip).arg(port); PeerInfo info m_peers[key]; info.ip ip; info.port port; info.lastSeen QDateTime::currentMSecsSinceEpoch(); info.online true; } void PeerList::sweep() { const qint64 now QDateTime::currentMSecsSinceEpoch(); for (auto it m_peers.begin(); it ! m_peers.end(); ) { if (now - it-lastSeen kTimeoutMs) { // 三個(gè)心跳周期沒更新就摘掉 emit peerOffline(it-ip, it-port); it m_peers.erase(it); } else { it; } } }心跳間隔我一般設(shè) 2 秒超時(shí)閾值設(shè) 3 個(gè)周期即 6 秒容忍偶發(fā)丟包。這里有個(gè)細(xì)節(jié)超時(shí)不要只靠“最后一次心跳時(shí)間”還要考慮本地時(shí)鐘被系統(tǒng)校時(shí)改掉的情況用單調(diào)時(shí)鐘 QElapsedTimer 更穩(wěn)妥示例里用毫秒時(shí)間戳是為了好讀。另外心跳包要單獨(dú)一個(gè) type不要和業(yè)務(wù)消息混用否則日志里滿屏都是心跳排查問題時(shí)根本看不清。5. 避坑與排查UDP 在真實(shí)網(wǎng)絡(luò)里的五條經(jīng)驗(yàn)Demo 在本機(jī)上跑通不代表能上線局域網(wǎng)環(huán)境里的問題基本集中在端口、地址、編碼和性能這四塊。下面五條是我在類似項(xiàng)目里真真切切碰過的。5.1 現(xiàn)象第二個(gè)實(shí)例一啟動(dòng)就收不到包現(xiàn)象同一個(gè)程序開兩個(gè)窗口做自測(cè)第二個(gè)窗口的日志一直為空bind 返回 falseerrorString 是“Address already in use”。原因QUdpSocket 的默認(rèn)綁定的綁定模式在多數(shù)平臺(tái)上對(duì)端口是獨(dú)占的第一個(gè)實(shí)例沒釋放之前第二個(gè)拿不到。解決接收端的 bind 調(diào)用統(tǒng)一加上 QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint兩個(gè)實(shí)例就能同時(shí)監(jiān)聽同一端口數(shù)據(jù)報(bào)會(huì)被復(fù)制給所有綁定者。需要注意這只適合調(diào)試正式場(chǎng)景里兩個(gè)進(jìn)程搶同一端口誰收到包是不確定的。5.2 現(xiàn)象本機(jī)自己發(fā)給自己一條都收不到現(xiàn)象發(fā)送端顯示 writeDatagram 返回了正數(shù)接收端 readyRead 就是不觸發(fā)換到局域網(wǎng)另一臺(tái)機(jī)器就正常。原因通常有兩個(gè)接收端 bind 的是某塊具體網(wǎng)卡的地址而發(fā)送端發(fā)往 127.0.0.1地址對(duì)不上或者目標(biāo)是 255.255.255.255 廣播但接收端綁定到了具體地址廣播包被網(wǎng)卡過濾掉了。解決接收端一律綁 QHostAddress::AnyIPv4讓它監(jiān)聽所有網(wǎng)卡包括回環(huán)自測(cè)時(shí)優(yōu)先往 127.0.0.1 單播確認(rèn)鏈路通了再試廣播。另外 Windows 上首次運(yùn)行會(huì)彈防火墻授權(quán)框點(diǎn)“取消”之后再想收包就得去防火墻規(guī)則里手動(dòng)放行這個(gè)坑很隱蔽。5.3 現(xiàn)象中文消息到對(duì)端變成亂碼或者問號(hào)現(xiàn)象發(fā)“溫度異常”四個(gè)字對(duì)方收到的是一串亂碼或者長度對(duì)不上解析失敗。原因QString 轉(zhuǎn) char* 時(shí)用了隱式轉(zhuǎn)換走的是 Latin-1 編碼中文直接被替換成問號(hào)另一種情況是兩端 QDataStream 版本不一致長度字段按不同規(guī)則序列化。解決所有字符串出入都顯式走 toUtf8 / fromUtf8協(xié)議頭里的長度字段按字節(jié)數(shù)算而不是按字符數(shù)算QDataStream 在兩端寫死同一個(gè)版本號(hào)比如都寫 QDataStream::Qt_5_15。上線前用一段純中文加 emoji 的測(cè)試串跑一遍比看十遍代碼管用。5.4 現(xiàn)象高頻發(fā)送時(shí)界面卡成幻燈片現(xiàn)象壓測(cè)時(shí)每秒發(fā)幾百個(gè)包界面按鈕點(diǎn)不動(dòng)日志窗口滾動(dòng)有延遲。原因有兩個(gè)疊加一是每條數(shù)據(jù)報(bào)都 emit 一次信號(hào)、追加一次日志到 QTextEdit控件重繪成了瓶頸二是 readyRead 里沒把隊(duì)列讀空事件循環(huán)反復(fù)被喚醒。解決接收槽里用 while 循環(huán)一次讀光攢到一個(gè) QVector 后再發(fā)一個(gè)批量信號(hào)界面?zhèn)扔?QTimer 每 100 毫秒合并刷新一次而不是來一條刷一條再不行就把網(wǎng)絡(luò)對(duì)象 moveToThread 到獨(dú)立線程用隊(duì)列連接把結(jié)果傳回界面。這個(gè)改法通常能把 CPU 占用從單核跑滿降到個(gè)位數(shù)。5.5 現(xiàn)象大包發(fā)出去了收到的卻是半截現(xiàn)象發(fā)一條幾十 KB 的 JSON接收端解析時(shí)報(bào)“數(shù)據(jù)不完整”pendingDatagramSize 拿到的長度比預(yù)期小。原因超過了鏈路 MTU 觸發(fā) IP 分片任何一個(gè)分片丟失整個(gè)數(shù)據(jù)報(bào)就作廢更極端的情況下超過 65507 字節(jié)writeDatagram 直接返回 -1。解決協(xié)議層強(qiáng)制單包不超過 1400 字節(jié)超出就按序號(hào)切片接收端做重組并設(shè)超時(shí)丟棄不完整的組或者干脆把大塊數(shù)據(jù)挪到 TCP 通道上UDP 只承載控制消息。這條屬于設(shè)計(jì)階段就要定下來的約束等上線再改代價(jià)很大。6. 二次開發(fā)把它抽成一個(gè)能復(fù)用的 UdpChannelDemo 里的 Sender 和 Receiver 分成兩個(gè)類是便于講解真到項(xiàng)目里我更愿意合成一個(gè) UdpChannel收發(fā)同一個(gè)套接字接口窄一點(diǎn)用起來省心。6.1 封裝邊界與接口設(shè)計(jì)我的做法是把 bind、發(fā)送、批量接收、對(duì)端列表全收進(jìn)去對(duì)外只暴露四個(gè)東西// src/net/udpchannel.h class UdpChannel : public QObject { Q_OBJECT public: explicit UdpChannel(quint16 localPort, QObject *parent nullptr); bool start(); // bind 連接信號(hào) qint64 sendTo(const QByteArray payload, const QHostAddress to, quint16 port); void enableBroadcast(bool on); signals: void messagesReady(const QVectorPacket::Message batch); // 批量上拋 void errorOccurred(const QString reason); };關(guān)鍵改動(dòng)有三個(gè)。其一接收側(cè)不再逐條 emit攢夠一批或者定時(shí)器到點(diǎn)再發(fā)界面?zhèn)扔嗛?messagesReady 就夠了刷新頻率和解包頻率解耦。其二把在線列表也吃進(jìn)來start() 里順帶起心跳定時(shí)器和過期清掃定時(shí)器調(diào)用方只需要關(guān)心“誰在線”這個(gè)信號(hào)。其三錯(cuò)誤統(tǒng)一走 errorOccurred 字符串而不是把 QAbstractSocket 的枚舉拋給上層界面層不該知道 SocketError 是什么。這套接口換到命令行程序或者后臺(tái)服務(wù)里照樣能用不依賴任何控件。6.2 驗(yàn)證方法別急著開界面封裝完先別寫界面用兩個(gè)終端驗(yàn)證鏈路更高效。Linux 或 macOS 上可以用 nc 直接發(fā)一條 UDP 包到本地端口看程序日志有沒有打印對(duì)端地址# 終端 1先跑起來你的接收端監(jiān)聽 45454 ./QTUdpDemo --listen 45454 # 終端 2發(fā)一條純文本 UDP 包到本機(jī) printf hello-udp | nc -u -w1 127.0.0.1 45454 # 終端 2 變體發(fā)廣播到當(dāng)前網(wǎng)段需要系統(tǒng)允許 printf probe | nc -u -w1 -b 255.255.255.255 45454看到日志里出現(xiàn) 127.0.0.1 和正確的負(fù)載長度說明 bind 和 readyRead 這條鏈通了再換到另一臺(tái)機(jī)器上重試通不過就按第 5 章的順序查網(wǎng)卡地址、防火墻、子網(wǎng)掩碼。之后再測(cè)組播用 ip maddr 看網(wǎng)卡有沒有真的加入組這一步能省掉很多“代碼明明沒錯(cuò)”的爭論。壓測(cè)用 for 循環(huán)發(fā)一萬個(gè)包統(tǒng)計(jì)接收端實(shí)際收到的數(shù)量丟包率在局域網(wǎng)內(nèi)應(yīng)該很低如果掉得厲害先看接收端是不是在界面線程里同步處理。這套流程我后來固化成了習(xí)慣每加一個(gè)網(wǎng)絡(luò)模塊先寫一個(gè)不依賴界面的最小可執(zhí)行用命令行和 nc 打通再把界面接上去。從那以后我每次新建網(wǎng)絡(luò)通信相關(guān)的類都強(qiáng)制先跑一遍自環(huán)和跨機(jī)兩條驗(yàn)證再動(dòng) UI 代碼。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色色色色色五月丁香| 亚洲啪啪精品| 亚洲旡码| 国产成人网址| 97日在线视频| 超碰在线看| 亚洲色欲欧美一区二区三区| 综合日本婷婷| 桃色成人网| 青草激情在线| 天堂A∨在线| 大香蕉精品视频| 美女丁香五月天| 任你躁XXXXX麻豆精品| 五月丁香色| 激情综合区| 亚洲精品一区中文字幕乱码| 欧美精品99| 99亚洲综合| 韩日另类| 丰满少妇猛烈A片免费看观看| 伊人久久五月天| 熟女网站久久| 日韩AV中文字幕在线| 无码激情| 人人操五月天| 大香蕉九操| 婷婷综合爱| 五月婷婷啪| 久草视频大香蕉99| 天天色综网| 色色五月婷婷久久| 久久久久思思热| 五月婷婷色播视频| 9|无码久久久久久| 99 热国产在| 精品人妻一区二区三区在| 婷婷五月花| 人妻操操色| 亚洲性视频| 一区=区操屄高清大全av| 99色热| 六月丁香好婷婷| 超碰在线看| 婷婷字幕在线| 久久您您综合网| 久机视频这只有精品| 99性视频| 天天摸色吧天天摸色吧| 婷婷五月噜噜| 婷婷狠狠色| 色五婷婷| 天天爱夜夜爽| 五月天国产婷婷精品视频在线| WWW.开心五月天.COM| 婷婷六月天精品| 99福利导航| 一区二区免费看| 丁香九月综合激情| VA日本视频| 狠狠爱激情网| 99久99热| 99免费热视频在线| 五月天六月色| 婷婷五月精品| 久久久九九九 99| 超碰69天堂| 久久日婷婷| 色拍九九九| 图片区 小说区 区 亚洲五月| 亚洲中文字幕网| 五月天社区婷婷丁香社区| 99热这里只有精品66| 久久色五月| 婷婷狠狠操| 天天日天天爽夜夜爽| 人人人va亚洲视频在线| 这里只有精品在线视频在线观看| 久久人人看| 女人天堂AV| 天天操天天曰| 日本在线观看aaa 99| 久久大香蕉视频| 亚洲成人AV在线观看| 哇嘎成人久久| 久色网| 综激情网| 五月婷在线视频免费看| 亚洲AV成人在线| 67194成I人在线观看线路1| 激情综合网色播五月| 色婷婷丁香五月| 激情五月天。| 色色色婷婷五月| 亚洲激情无码久久| 日韩999| 亚洲九九夜夜| 九九九日本熟女| 538在线| 激情深爱综合网| 色婷婷五月天偷拍| 壅壅儕家a| 97热九九| 五月婷婷六月爱| 天天舔天天摸天天透| 大香蕉婷婷久久| 婷婷性爱| 碰人人97| 丁香五月天五码婷婷| 在线可以看的av网址| 97操视频| 婷婷免费视频| 五月丁香狠狠爱婷婷综合| 色婷婷五月综合网| 五月综合激情| 国内在线99视频| 玖玖视频福利| 色欲午夜无码久久久久久张津瑜 | 久9视频| 9 1大香蕉| www.激情com| 久久资源网五月婷| 久久久人妻| 黄桃AV无码免费一区二区三区| www.com.色色| 五月婷婷官网色| 四川女人毛多水多A片| 丁香花色色网| 99热在线这里| 伊人喵咪a V| 操比激情五月综合| 亚洲九九视频| 91女人18毛片水多国产| 色婷婷91激情小说| 另类小说五月天| 99ri久久| 99热这里只有精品2| 亚洲春色奇米影视| 天天日天天做天天操| 色婷五月| 五月丁香婷色| 91色性感五月婷婷丁香| 五月丁香婷婷综合视频| 888久久久| 丁香婷婷中文字幕| 香蕉人妻AV久久久久天天| 色色丁香婷婷综合| 伊人婷婷五月天| 深爱五月天| 五月丁香六月综合基地| 久久99久久99精品免视看婷婷| 丁香久久久| 丁香五月婷婷六月婷| 亚洲热热视频| 欧美va视频不用播放器的va视频网| 五月婷婷六月丁香在线视频免费在线观看| 午夜日韩久久久网站| 色五月天中文字幕| 色优久久| 性日本精品| av不卡网站| 色婷婷综合网站| 潘金莲AAAAAAAAAA| 久操97| 五月丁香大相交| 久久伦乱| 五月婷婷色播网| 香蕉人妻AV久久久久天天| 天天久久综合| 99热1| 天天狠狠夜夜狠狠2023| 深爱五月天天| 亚洲狠狠丁香婷婷香蕉| 日韩av在线免费观看| 另类激情五月| 香蕉AV777XXX色综合一区| 色高清无码视频| 99久久偷拍视频| 激情综合五月开心狠狠| 极品色丁香| 久久女婷| 天天草天天舔| 欧洲亚洲午夜| 色婷婷六月| 成人婷婷五月天| 丁香色婷婷色手机免费在线| 可以直接看的av| 日韩精品超碰在线观看| 99无码| 日韩色情亚洲五月天婷婷| 日本三级99人妇网站| 亚洲激情五月丁香久久久久| 日韩成人AV在线播放| 97精品自拍| 丁香丁香激情网| 女人天堂AV| 亚洲五月天婷婷综合| 色婷婷久久9.com| 超碰成人在线观看| 狠狠色婷婷777| 狠狠狠狠狠狠色| 99性爱| 丁香五月天五码婷婷| 色吊丝av中文字幕| 香蕉AV777XXX色综合一区| 五月天.com| 国产乱码久久| 亚洲天堂碰碰婷婷| 久久小视频| 野战毛片三一3| 天天久久人人| 日本久热| 色婷婷情片| 丁香五月婷婷五月| 26uuu成人网| 色婷婷丁香五月综合| 综合色99| 操操自拍| 久草丁香婷婷五月天婷| 丁香花综合永久入口| 99热这里只有精品16| 激情婷婷五月基地| 丁香六月成人网| 婷婷色影院| 激情五月天婷婷丁香| 天天干天天做| 久久精品99| 超碰在线中文字幕| av在线色五月丁香婷区久| 激情综合5| 色综合久网| 风流少妇A片一区二区蜜桃| 婷婷亚洲在线| 丁香婷婷射| 久久婷婷的综合色丁香五月| 人人操9| 色婷婷狠狠18禁| AV在线中文| 丁香五月电影| 五月婷婷激清网| 色八月婷婷| 天堂中文国产| 九九久久五月天综合伊人| 碰碰碰碰碰99| 九九超碰人人| 色99色| 91嫩草久久| 99操不停| 99九九中文字幕视频| 国内熟女黄色系列| 人人97操| 色9月| 黄色视频网站在线播放| 亚洲综合网在线| 五月婷av| 国产精品久久久久久久久久| 九九色婷婷| 久久婷婷五月天| 中文无码婷婷| 色婷视频| 婷婷五月丁香亚洲| 九九热婷婷| 久婷婷色| 如何安全看伊人婷婷| 色 免费网站视频| 久久精品4| 六月99天天婷婷激情综合| 9999三级片| 色欲婷婷五月天| 久久五月丁香婷婷| 爱婷婷五月| 99热这里只有精品最新| 99热资源在线| 99热精品在线| 一区二区传媒视频| 妇激情基地| 久久婷婷成人视频| 婷婷五月丁综合| 五月丁香六月综合激情无码软件亮点| Av九九| 激情影院丁香五月| 婷婷五月激情综合网| 99ri国产精品| 丁香婷婷精品视频| 无码 色| 91婷婷搞| 色婷婷激情五月天丁香| 国产精品美女| 91啪级电影| 亚洲丁香五月| A久久| www.色色五月天.com| 婷婷五月天综合网| 超碰人人摸AV| 亚洲网视屏| 亚洲激情 久久| 五月婷婷激清网| 色婷婷五月天偷拍| 色综合色| 热久国产| 丁香六月婷婷综合在线| 99色热视频| 日韩精品一品二区三区的使用体验| 久超超碰| 精品日本视频444| 日韩在线成人电影| 色婷婷色五月色丁香| 五月丁香天堂网| 在线不卡视频| 超碰色天堂| 午夜婷婷丁香| 亚洲美女网Va| 91热久88| ...婷婷国产成人亚洲日韩| 六月丁香久久| 日本一级黄色片。| 欧美欧盟性爱网| 亚洲第一精品成人999久久精品| 亚洲AV综合网| 激情五月天婷婷色色色色色色色色色色色 | 国产精品成人AV在线| 九九热这里有精品23| 丁香六月天之亚州热女 | 色色色免费视频| 91夫妻网站九色| 中文字幕在线观看视频www| www,五月天激情| 婷婷六月激情| 日韩人妻在线观看| 色色色色色网| 欧美日韩国产日本精品四虎网网站物| 五月婷婷狠狠干| 国产精品美女| 人妻性操逼中文字幕 国产| 狠狠干在线| 日韩人妻AV在线| 激情综合自拍五月婷婷色五月| 五月激情婷婷国产精品久久久久久| 国产午夜精品一区二区三区嫩草| 91九色视频| 激情五月婷婷在线观看| 久操人| 精品,99| 情欲禁地| 99热这里有精品2| 青草青青草| 国内一级片| 日本色婷婷五月天成人电影| 天天干,天天日| 色婷婷久久综合| 玖玖在线视| 五月综合丁| 天天狠狠干| 亚洲三A| 日 日干 日日做| 六月激情婷婷| 六月亚洲| 超碰操日| 婷婷久久色| 在线播放成人| 九九大香蕉黄色影院| 青青草a在线| 国产成人99久久亚洲综合精品| www色五月| 激情丁香婷婷| 色八月婷婷| 中文字幕网伦射乱中文| 人妻在线中文字幕久久| 亚洲av成人一区二区电影在线| 五月天精品视频| 久久天堂女人| 婷婷色色丁香五月天| 91久久精品无码一区二区三区| 丁香五月婷婷激情尤物| 99久久九九| 婷婷五月婷婷| 日日懆天天懆| 99re热在线观看| 久久婷婷91| 综合激情五月四射婷婷| 婷婷色资源| 五月丁香成人网| www.91.com黄| 成人无码精品1区2区3区免费看| 狠狠操狠狠狠| 五月婷婷激情日本| 日本一级黄色电影| 深爱五月婷| 美欧成人视频| 色婷婷丁香五月天| 色色色图| 久热2025无码| 青青草原爱爱网| 丁香婷婷九月| 色五月天网| 久久婷婷丁香五月宗合| 色色五月天婷婷| 婷婷五月偷拍| 狠狠搞五月天| 色吊丝av中文字幕| 五月天激情视频| 五月丁香婷婷激情澎湃四射| 成人在线日韩| 性做爰1一7伦| 婷婷丁香色情| 射久久丁香五月| 五月丁香在线观看99| 婷婷五月天av| 亚洲人成色A777777在线观看| 五月久久五月激情| 丁香六月婷婷缴情欧美| 9久精品| 色丁香久综合在线久综合在线观看| 亚洲天堂有码| 嫩BBB搡BBBB榛BBBB| 色五月婷婷网| 天天色激情| 亚洲人妻av| 97碰碰免费.视频| 婷婷五月天堂| 色五月综合在线| 在线观看五月婷婷网| 任我肏视频精品| 日本天天色| 夜夜骑夜夜操| 性日本精品| 色天天综合天天综合频道。| 影音先锋毛片网站| 99九九热视频免费| 久热精品免费视频4| 无码色| 亚洲婷婷五月天| 中文不卡一二区| 日韩 欧美 国产 一区 二区| 99热最新精品| 97久久五月丁香婷婷| 亚洲狠狠终合停停终合| 熟妇内谢69XXXXXA片| 成人国产综合| 97视频.干com| 97干在线观看视频| 免费观看大片视频 丁香婷婷 六月欧美| 午夜精品777| 婷婷丁香六月综合激情站| 欧美色色色色色色| 午夜成人在线免费视频| 久re在线| 婷婷五月18永久免费网站| 1024在线一区| 国产成人综合电影| 色五月 婷婷, 大香蕉| 97色碰| 亚洲色99| 国产67194| 国产成人网站在线观看| 五月丁香大香蕉| 久月婷婷| 99热这里只有精品55| 国产激情综合| 狠狠操狠狠操AV| 天天肏视频| 99精品视频偷拍| 色欲影香| WWW.婷婷| 欧美日韩欧美| 婷婷开心激情| 欧美成人精品三区综合A片| 五月婷在线| 综合激情视频| 嫩草AV久久伊人妇女超级A| 婷婷五月天影院| 日本天天色| 国产成人+综合亚洲+天堂| 色五月五月婷婷| 五月天色五月| 欧美婷婷丁香社区在线播放| 操逼综合网| 五婷婷综合网| 十区AV| 猫咪伊人久久| 成人羞羞啪啪 全 视频| 热99这里只有精品视频| 99视频精品在线| 色婷婷五月天成人网| 色婷五月天| 五月婷婷丁香五月| 亚洲综合色婷婷文学| 操婷婷基地| 久草性爱| 丁香五月亚洲无码| 无码色| 婷婷精品| 色综合视频在线| 久草婷婷视频| 五月丁香猫咪久久婷婷综合视频激情四射网入口| 欧美日综合| 天天日夜夜夜操操操操| 9l视频自拍9l九色9l成人| 3www激情| 五月丁小婷婷激情四射| 爆乳熟女一区二区三区爆乳| 天天看片日日夜夜| 久久99热这里只有精品| 天天日天天干天天操| 欧美性生交A片免费看| 婷婷五月天丁香久久| 亚洲 视频 导航 一区| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 人人摸人人干| 97碰碰在线观看视频| 亚洲婷婷在线播放十月| 99热九九热| 亚洲五月天婷婷| 丁香五月婷婷av影院| 123草逼网| 狠狠色综合777| 丁香五月欧美午夜视频| 九热视频| 亚洲成av人影院| 91天堂网综合| 精品皮股午夜AV| 丁香六月啪| 色婷婷色综合| 五月丁香少妇A| 91碰超| 丁香婷婷九月在线| 九九家庭影院| 色五月琪琪| 亚洲av电影在线| 婷婷五月天在线看| 操九色| www.一区二区三区| 色婷婷在线视频久| 99A片| 性做爰1一7伦| 九九视频免费| 97久久人人操| 天天综合 99久久婷婷| 激情小说之五月| 色色热| 久久精品99久久| 丁香五月综合网亚洲综合欧美狠狠| 五月婷婷天| 激情五月天啪啪| 五月丁香婷爱在线| 91呦呦呦| 五月丁香婷庭在线| 国产看真人毛片爱做A片| 亚洲免费看片| 久操人妻| 精品久久99| 色综合久久88色综合天天看| 亚洲午夜Av| 婷婷五月天色| 九九热99精品| 久久久久丁香婷婷五月天| 天天揷综合网| 六月丁香婷婷在线波多| 黄网在线免费观| 激情亚洲五月| 国产真人做爰视频免费| 久热最新视频| 亚洲狠9| 久久久久人妻中文| 色综合网页| 久久婷婷五月综合色丁香| 97爱艹婷婷开心丁香激情综合| 五月丁香啪啪拍| 婷婷97| 日日干综合| 四LLL少妇BBBB槡BBBB| 秋霞午夜理论| 九九热青草| 人人做人人看人人摸| 精品欧美一区二区三区久久久| 欧美激情Va| 欧美电影在线播放| 色色 9| 久久爱综合| 色五月中文网| 99啪啪视频| 丁香激情网| 五月天开心色情网| 婷婷五月综合色小姐小说| 激情五月婷婷丁香| 色丁香五月| 亚洲综合九九| 亭亭色天香| 97色五月丁香婷婷| 99九无网码| 色婷婷基地| 国产午夜精品AV一区二区麻豆| 久久伊人日日夜夜| 十区av| 久久97| 色综合五月在线| 婷婷黄色网| 久久狠狠干| 噜一噜免费视频| 在线看九一V图片| 五月天啪啪| 亚洲高清在线| 婷婷丁香成人色综合| 婷婷狠狠干| 99色在线观看| 色五月噜噜| 爆乳熟妇一区二区三区爆乳| 激情婷婷亚洲五月| www.久久久久久| 欧美在线干| 婷婷五月天狠狠| 99ri精品| 曰本aaaaaa丈片| 99热这里全是精品| WWW,五月| 久久黄色免费视频| 97黑人精品区| 1024操逼| 九九精品热| 26uuu另类亚洲欧美日本一| 欧美婷婷丁香五月社区| 1024在线视频| 国产毛片精品一区二区色欲黄A片 欧美交换配乱吟粗大25P | 亚洲国产精品VA在线看黑人| 天天日夜夜| 色狠狠综合网| 99热这里是精品| 丁香五月ⅤA久久久| 色播五月网| 亚洲最大视频| 婷婷五月天伦理| 国产综合视频婷婷| 婷婷色色丁香| 69凹凸成人综合网| 精品婷婷| 在线中文av| 99亚州综合精品成人网| 激情五月色综合国产精品| 婷婷五月天六点丁香五月| 久操乱| 色激情五月天| 五月婷婷中文| 综合AV在线| 天天色天天爱天天爱天天爱y| 无码一区二区三区四区五区| 五月伊人网| www.五月婷| 琪琪布丁香社区激情五月天| 伊人久久婷婷| 在线日韩视频| 日韩久热| 九九精品综合| 天堂综合久| 婷婷综合精品视频97| 99热骚货| 天天干天天干天天干天天干天天干天天| 丁香五月久久| 五月激情啪啪啪| 色色色色色五月丁香| AV大片在线观看| 亚洲九九99精品视频在线播放| 99热精品在线观看| 公的粗大挺进了我的密道| 五月综合久久| 色婷婷五月在线| 婷婷五月天激情四射| 91在线日| 五月婷婷中文| 综合网天天| 婷婷俺去也| A久久| 99∨VTV| 日日干日日| www.婷婷| 日本视频久久| 五月色情婷婷| 五月婷婷综合影院| 久久婷婷网| 色综合婷婷| 99色在线视频观看| 热99视频精品| 亚洲精品五月| 噜噜狠狠色综无码久久合欧美| 操骚货在线| 91精品国产99久久久久久天美| 999激情视频| 天天干天干| 九九在线视频| 日韩AC在线免费观看| 久久全色| www.婷婷五月天.com| 五月婷婷综合网| 色婷婷欧美在线| 另类视频丁香五月| 五月久久婷婷天堂视频| 天天插天天射| 一本到不卡高清DVD| 激情久久网 | 五月开心婷婷极品激情| 丁香五月大片| 天天天干夜夜夜操| 99免费| 超碰成人黄色网| www,色综合| 色婷婷XXXXX| AAA亚洲AV| 婷婷五月色情| 另类少妇人与禽zOZZ0性伦| 国内自拍97在线| 日本成人综合| 日日射天天射| 最新av在线观看| 亚洲婷婷五月天| 99热日本精品| 天天干夜夜操A片| 色色cOm| 色999五月色| 超碰人人摸人人操| 五月丁香啪啪啪综合网| 久色五月婷婷综合| 五月婷婷五月天| 综合久久激情久久| 激情五月综合| 五月婷六月| 亚洲成人网站在线观看| 日韩美女羞羞网站在线观看| 丁香狠狠| 殴美日比视频| 亲子乱av一区二区三区的| 色色精品色| 欧美婷婷综合| 成人国产欧美大片一区| 97干97色| 婷婷俺去也| 欧美情色一区| 婷婷五月激情四月综合| 99综合网| 国产精品24r| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 五月婷婷啪啪| 婷婷99视频精品| 六月婷婷久久大全| 任你躁XXXXX麻豆精品| 色婷婷丁香| 丁香六月激情国产| 夜夜嗨一区二区三区直播内容| 丁香色五月 97干| 五月婷婷丁香婷婷| 五月丁香六月综合图| 99超在线| AV性爱网| 综合网色| 五月婷网| 久婷久婷| 99国产精品久久久久久久久久久| 丁香五月 性爱| 开心日韩丁香婷婷五月| 五月天激情婷婷| 久久98| 99久热在线精品| 九九精彩久久| 欧美性爱五月天| OUMEIRIHANCHENGREN| 操啊操av| 91久久国产自产拍夜夜91久久精品文字>91麻豆精品国产 | 天天爽曰日爽| 在线看的免费网站| 婷婷色天香| 疯狂做受XXXX高潮A片| 五月丁香六月婷婷精品| 青青草五月天| 久久婷婷六月| 色婷五月天| 久久AAAA片一区二区| 东京热免费视频| 开心五月激情| 午夜天堂一区人妻| 操嫩逼电影| 色色色色色色综合网| 五月丁香五月天现场视频| 欧美色男人网站| 五月丁香久久呀| 91麻豆国产三级精品福利在线观看| 婷婷天天综合| 伊综合蕉| 婷婷五月激情网| 色播婷婷五月天| 超碰9799| 婷婷丁香人妻天天| 天堂综合久| 91丨九色丨熟女| 久操操| 九九热免费视频| se99在线| 午夜福利成人AV91| 日韩超碰在线| 久久这里只精品66| 夜夜操加勒比| 丁香桃色网| 人妻久热| 亚洲乱码精品久久久久..| 亚洲精品小视频| 色五月色情| 丝袜人妻| 色婷婷六月综合| 99在线爽| 这里只有精品在线观看视频| 天天插天天日天天爽| 久久婷婷五月综合色和| av在线观看网站| 凹凸7777操操操| 精品久9| 久久久久久97| 翔田千里aV中文字幕| 97色一二三| 色热久| 婷婷五月天六月综合| 97久久精品视频| 色婷丁香| 丁香婷婷啪啪啪| 五月丁香婷婷婷激情爱爱| 色综合99| 婷婷五月天激情诱惑| 丁香五月性| 九九99精品视品| 久久激情五月婷婷| 亚洲激情视频网| 九九人人精品| 亚洲欧美在线观看| 成人婷婷| 思思久日精品视频| 亚洲网视屏| 日本美女天天日天天爽| 97人人干视频| 九九Av| 丁香五月区| 色天天综合天天综合频道。 | 九九精品碰| 五月丁香色综合| 婷婷五月丁香六月综合网| 六月婷婷网| 色婷婷色综合激情91| 荡乳尤物3HP1V5| 久久综合首页| 夜夜爽天天日| 狠狠色丁香综合| 玖玖婷婷色五月| 小香蕉av| 91超级碰碰| 日本啪啪网| 五月丁香中文字幕| 九九视频精品在线免费| 国产 码在线成人网站| 9久操| 爱久久小说下载网| 五月天婷婷在线播放| 亚洲激情网| 五月丁香青草综合啪啪| 综合五月草| 色综合天堂| 99在线综合视频| 丁香情色五月| 精品夜夜澡人妻无码AV| 色99网站| 天天操无码| 日日夜夜干| 丁香六月情| 五月婷婷丁香综合| 夜夜夜叫天天天做| 婷婷丁香高潮了| 六月丁香婷婷拍拍| 激情五月天视频| 久久日韩婷婷五月| 丁香婷婷婷| 日韩成人影片网站| 男男野外做爰全过程69| 五月丁香综合| 久久精品99| 深爱激情六月天| 五月丁香| 五月天伊人网| 天天搞天天爽| 26uuu成人网| 久久日九九| 99ri国产精品| 五月亭久久无码视频| 久久一伦| 婷婷99丁香| 小泽玛利亚视频一区二区| 99九九热视频免费| 日韩一级网站| 99精品久久久久| 黄色精品五月婷婷| 日本操碰碰| 成人在线网| 丝袜大香蕉| 色六月天天激情综合网| 91热er| 2020夜夜操天天爽| 亚洲色综合性| 色五月激情五月天| 婷婷丁香六月天| 色色色婷| www.99热| 99国产精品久久久久久久久久久| 610018岁成人视频| 久久综合最新网址| 伊人网啪啪| 天天久久综合| 久久99最新地址| 久9热视频在线| 婷婷激情五月天桃花网| 91人人妻人人操| 久久伦乱| 天天 青草 制服丝袜 在线| 色综合久久五月| 99精品久久久久久久婷婷久久 | 婷婷9月天| 五月婷婷亚洲色图| 日日噜狠狠| 在线VA视频| 69色色视频| 中文AV网| 色婷婷综合网| 九色99视频| 9热精品| 激情com| 在线1青婷| 婷婷亚洲影院| 激情婷婷丁香五月| 神马欧美精| 色五月激情问网站| 五月婷婷天| 狠狠色色| 久久久高清| 免费亚洲婷婷中文字幕| 色狠狠六月| 婷婷的色色五月天| 中文字幕日产A片在线看| 91碰九色| 青草性爱视频| 十一月婷婷激情四射| 国产成人网站在线观看| 九九色插| 婷婷亚洲日本| 天天色综网| 另类小说色婷婷| 色色97丁香婷婷五月天| 欧美性二区| 婷婷五月丁香综合激情| 亚洲中文字幕av| 亚洲Av成人在线观看| 久久五月天激情婷婷| 人人干人人看| 丰满老熟妇BBBBB搡BBB| 精品网站:999WWW| 狠狠狠五月婷婷六月丁香| 在线视频另类| 99ri6在线视频| 丁香五月婷婷亚洲色图| 久久久无码精品成人A片小说| 内射人妻视频国内| 中文字幕综合网| 婷婷五月婷| 熟女人妻一区二区三区免费看| 五月婷婷色播| 91精品久久久久久综合五月天| a久久| 五月综合激情| 日本五月婷| 精品亚洲国产成AV人片传媒| 五月激情综合网| 欧洲亚洲精品| 大香蕉伊人丁香五月| 婷婷香香五月| 综合激情在线视频| 97色视频网| 日本不卡五月婷婷丁香| 婷婷五月天激情小说| 99激情在线| 色婷婷小说网| 色五月激情图片| 夜夜操少妇| 超碰在线人妻| 欧美日韩999| 色你久久| 亚洲色图81p| 99乱视频| 色播激情婷婷| 色五月成人网| 91男同视频| 五月激情综合婷婷| 丁香六月婷婷| 婷婷色色狠狠| 色五月成人| 久久婷婷视频| 久久XX| 中文字幕在线资源| av色婷婷| 亚洲另类婷婷综合| 激情综合区| 婷婷综合五月天| 爱久综合| 色婷婷狠狠18禁| 日韩操人| 狠狠搞五月天| 激情深爱五月天| 99视频色在线观看| 色婷久久| WWW色五月天| 久久婷婷五月| 五月婷婷香蕉| 97久久综合网| 人草人人| 91久久免费| 成人在线视频一区| 色婷婷丁香五月| 久久国产性爱A V| 少妇AB又爽又紧无码网站| 丁香六月色情| 婷婷在线五月综合| 99视频这里只有精品10| 国内久久久精品99| 婷婷五月电影| 久久久久久久丁香五月天婷婷| 26UUU精品一区二区| 99超在线| 五月丁香本色在线观看| 激情五月,婷婷五月,丁香五月| 性爱网六月丁香| 色婷婷免费视频| 婷婷色婷婷亚洲成人| 欧美丰满熟妇BBB久久久| 九九久久五月天综合伊人| 国内久久婷婷| 狠狠爱婷婷爱| 夜夜骑日日操| 色噜噜狠狠狠狠色综合久欧美| 特级西西4444www无码| 日本操碰碰| 国产精品涩涩涩视频网站| 婷婷五月噜噜| 超碰色婷婷| 大香网伊人久久综合| av在线色五月丁香婷区久| 97超碰欧美中文字幕| 91九色首页| 综合激情网| 久久婷婷六月综合综合| 色玖玖| 深爱五月天 开心网| 色婷九九九| 五月婷婷av| 五月综合六月婷婷| 久久五月激情综合| 96精品成人无码A片观看金桔| 欧美激情综合色综合| 五月丁香亭亭操逼| 国产黄大片在线观看画质优化| 亚洲天天| 久色视频在线| 久久一伦| 97色婷| 丁香五月天啪啪| 天天激情综合| 91久久国产综合久久| 第五色婷婷| 色偷偷色婷婷| 日韩人妻无码一区二区| 四射综合网| 亚洲五月天激情| 丰满人妻一区二区三区| 激情婷婷人妻| 色婷婷69| 久久婷综| 激情六月婷婷| 五月丁香啪啪啪| 色丁香久综合在线久综合在线观看| 九色无码| 丁香五月影| 亚洲日日日| 色五月激情五月开心五月| 综合激情网| 五月丁香av中文| 亚洲视频另类| 欧美性生交XXXXX无码小说| 色在线99| 九九99一区| 婷婷大美在线| 成人短视频在线观看| 99re免费视频| 97一区二区| 色婷婷五月综合| 99熟女啪啪视频| 亚洲成人噜噜| 五月婷婷久久爱| 欧美噜噜噜草| www.jiujiujiu| 久久五月情| 五月丁香婷婷钟和色图| www.久久99| 日本精品99| 五月婷婷激情中文字幕| 婷婷六月情| 婷婷五月天日日日干干干| 4399在线观看免费高清电视剧| 丁香婷色| 婷婷五月天中文字幕| AV网址大全在| 西西4r午夜剧场| 全部老头和老太XXXXX| 免费精品99| 婷婷伊人网| 久久激情五月| AAA久久久| 精品久久久999| www.激情| WWW.17C亚洲精品| www.五月.com| 亚洲久热| 99亚洲精品视频| 婷婷啪啪| 99久久激情视频| 色色色欧美| 9999久久久久| 人人摸人人搞| 五月天婷婷丁香| 色婷婷www| 九九热视频在线观看| 五月天色五月| 婷婷色色网| 国产成人一区二区三区在线观看| www.夜夜操| 日本熟妇乱妇熟色A片蜜桃| 色综合99| 免费看欧美成人A片无码| 青草视频在线播放| 琪琪布丁香社区激情五月天| 婷婷97色| 中文字幕成人日韩| 欧美熟妇一区二区三区| 小色小蛇伊人婷婷色香五月| 国产色网站| 日本精品99| 久久婷婷成人视频| 狠狠操天天操天天操| 深爱开心五月天| 五月激情基地| 免费五月婷婷网| 热99在线精品| 五月丁香综合激情| 9久久精品| 亚洲中文字幕AV在线| 丁香婷婷综合影院| 亚洲99在线| 操操操91| 99热在线播放| 九九爱激情| 亚洲成人无码片| 久久98热re| sesesesezonghe| 婷婷五月天手机版视频| 色狠狠综合入口| 另类精品视频在线观看| 丁香五月婷婷在线| 国产精品第一国产精品| 色婷婷人人| w婷婷五月婷婷w| 99热欧| 黄色激情五月天| 久久激情五月| 九九九九精品精| 五月婷婷日| aaaaaa片| 影音先锋人妻出差| 区美毛片子| 少妇被下春药玩弄A片| 久久久日韩特色特黄AAAA| 99九九在线精品热动漫| www..com色爱| 婷婷色五月丁香六月欧美啪| 91碰碰| 五月天激情亚洲| 狠狠爱综合| 久久欧洲综合网| 婷婷伊人久久| 狠狠干.com| 综合色五月| 人妻操在线看| 色噜噜综合网| www,99热在线观看| 九九九这里只有精品| 久久久精品人妻录| 99爱在线精品视频免费观看| 性爱激情久久| 婷婷六月激情小说网| 午夜五月天| 久久久久9| 天天色99| 丁香五月综合在线播放| 99日本精品视频热| 超碰2021| 久久五月天合网| 91色在线 | 日韩| 99国产在线精品视频| 色婷婷成人网| 丁香婷婷激情网站| 97操操| 精品牛仔裤超碰| 婷婷五月天堂一本在线| 亚洲激情AV| 久久九九玖玖| 国产VA亚洲VA96| 99热| 狠狠操狠狠爱| 九九综合| 色色六月| 黄色99网| 丁香五月天啪啪| 97久人人| 丁香五月色欲| 亚洲成av人影院| 久久精彩综合视频| 日本婷婷在线| 亚洲成人在线观看网址| 久久 这里只有精品1| 五月天伊人| 欧美激情综合色综合啪啪五月| 天天做天天爱天天做| 免费视频在线观看的网站| 天天想夜夜爽天天爽| 999婷婷综合| 亚洲无aV在线中文字幕| 婷婷色五月综合| seuuu婷婷| 97激情五月天| 九九久久综合| 99精品在线播放| 久久色婷婷| 亚洲婷婷丁香| 中文字幕成人影视| 久久久五月天网站| 日日天天干| 久久久噜噜噜www成人| 99热12| 26uuu色五月| 国产精品婷婷午夜在线观看| 色日本颜射| 69激情小说| 日本欧美成人片AAAA| 婷婷在线操| 午夜精品人妻无码一区二区三区| www.婷婷网| 久热9| 综合久色五月| 少妇人妻丰满做爰XXX| 婷婷五月天日逼| 国产日韩精品SUV| 五月丁香啪啪啪啪| 精品成人在线| 婷婷五月久久| 久久成人亚洲欧美电影| 久热这里只有精品视频免费观看| 亚洲韩国日产综合AV| 色婷婷丁香五月天在线观看| 99精色|