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

ARTICLE DETAIL

資訊詳情

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

【C++標(biāo)準(zhǔn)項(xiàng)目】發(fā)布訂閱式消息隊(duì)列(篇二):C++ 第三方庫(kù)實(shí)戰(zhàn):Protobuf 與 Muduo 從原理到上手

【C++標(biāo)準(zhǔn)項(xiàng)目】發(fā)布訂閱式消息隊(duì)列(篇二):C++ 第三方庫(kù)實(shí)戰(zhàn):Protobuf 與 Muduo 從原理到上手 先看全景這兩個(gè)庫(kù)在項(xiàng)目里各自站哪個(gè)位置一個(gè)典型的 C 網(wǎng)絡(luò)服務(wù)比如消息隊(duì)列、RPC 框架、游戲網(wǎng)關(guān)骨架大致是三層Protobuf 是協(xié)議層的答案你用.proto描述數(shù)據(jù)結(jié)構(gòu)編譯器給你生成 C 類序列化出來(lái)是緊湊的二進(jìn)制跨語(yǔ)言、跨平臺(tái)、可向后兼容地演進(jìn)。Muduo 是傳輸層的答案陳碩寫的非阻塞 IO 事件驅(qū)動(dòng)網(wǎng)絡(luò)庫(kù)主從 Reactor 模型one loop per thread讓你用「注冊(cè)回調(diào)」的方式寫高并發(fā) TCP 服務(wù)而不用手寫epoll那套狀態(tài)機(jī)。兩者組合起來(lái)就是一個(gè)能對(duì)外提供穩(wěn)定二進(jìn)制協(xié)議服務(wù)的最小工業(yè)級(jí)骨架。下面分兩大塊講。第一部分Protobuf1.1 Protobuf 是什么Protocol Buffers簡(jiǎn)稱 Protobuf / PB是一套數(shù)據(jù)結(jié)構(gòu)序列化與反序列化框架。三個(gè)核心特點(diǎn)特點(diǎn)含義語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)一份.proto可生成 Java / C / Python / Go 等多語(yǔ)言代碼天然支持跨端通信高效二進(jìn)制編碼 變長(zhǎng)整數(shù)編碼比 XML 更小、更快、更簡(jiǎn)單典型場(chǎng)景體積約為 JSON 的 1/3 ~ 1/10擴(kuò)展性、兼容性好可以往 message 里加字段而不破壞已經(jīng)上線的舊程序——這是它能做長(zhǎng)期協(xié)議演進(jìn)的根本原因?yàn)槭裁醇幼侄尾黄茐呐f程序能成立這是 PB 最值錢的設(shè)計(jì)值得單獨(dú)說(shuō)清楚每個(gè)字段都有唯一編號(hào)編碼進(jìn)字節(jié)流的是編號(hào)不是字段名新版本增加的新編號(hào)舊程序解析時(shí)不認(rèn)識(shí)就跳過(guò)skip不會(huì)報(bào)錯(cuò)舊程序發(fā)的數(shù)據(jù)缺少新字段新程序讀到的是字段默認(rèn)值proto3 中標(biāo)量默認(rèn)是 0 / 空串 / false。所以協(xié)議演進(jìn)的原則是只加不減、不換類型、不復(fù)用編號(hào)。1.2 Protobuf 使用流程標(biāo)準(zhǔn)三步走1. 寫 .proto 文件 定義 message 及其字段 ↓ 2. protoc 編譯 .proto 生成 xxx.pb.h / xxx.pb.cc ↓ 3. 在業(yè)務(wù)代碼里 include 用生成的類 set/get 字段、序列化、反序列化可以理解為.proto是協(xié)議源碼protoc是協(xié)議編譯器.pb.h/.pb.cc是協(xié)議 SDK。改協(xié)議 改.proto重新編譯業(yè)務(wù)代碼跟著編永遠(yuǎn)不存在手寫解析函數(shù)寫漏一個(gè)字段的問題。下面用一個(gè)通訊錄 Demo把這套流程完整跑一遍。1.3 快速上手通訊錄 DemoDemo 目標(biāo)很樸素但足以覆蓋全部關(guān)鍵動(dòng)作對(duì)一個(gè)聯(lián)系人信息用 PB 序列化拿到二進(jìn)制結(jié)果把二進(jìn)制結(jié)果用 PB 反序列化解析出聯(lián)系人信息聯(lián)系人字段姓名 年齡。Step 1創(chuàng)建.proto文件命名規(guī)范文件名全小寫多個(gè)單詞用_連接例如lower_snake_case.proto??s進(jìn)規(guī)范文件內(nèi)代碼統(tǒng)一2 個(gè)空格縮進(jìn)不是 4 個(gè)這是官方風(fēng)格。新建contacts.proto。Step 2加注釋支持//單行與/* ... */多行和 C 一致。Step 3指定 proto3 語(yǔ)法syntax proto3;proto3 是當(dāng)前最新的語(yǔ)法版本簡(jiǎn)化了 proto2 的寫法且必須寫在除去注釋后的第一行不寫這行編譯器默認(rèn)按proto2解析——很多為什么生成代碼里多了一堆has_xxx()的疑惑都源于此。Step 4package聲明可選但強(qiáng)烈建議package contacts;package表示.proto的命名空間用來(lái)避免不同模塊間 message 重名沖突編譯成 C 后它會(huì)變成同名的 namespace即contacts::PeopleInfo項(xiàng)目里要有唯一性通常用「項(xiàng)目名.模塊名」的層級(jí)寫法如package mq.common;。Step 5定義 message消息message就是我們要傳輸?shù)慕Y(jié)構(gòu)化對(duì)象。在網(wǎng)絡(luò)里雙方必須先定制協(xié)議——說(shuō)白了就是約定結(jié)構(gòu)體長(zhǎng)什么樣PB 用message來(lái)承載這件事并據(jù)此幫你生成類和方法。message 消息類型名 { }命名規(guī)范駝峰命名首字母大寫。syntax proto3; package contacts; // 定義聯(lián)系人消息 message PeopleInfo { }Step 6定義消息字段字段格式字段類型 字段名 字段唯一編號(hào);三條規(guī)范務(wù)必記住字段名全小寫多個(gè)單詞用_連接snake_case字段類型分為標(biāo)量數(shù)據(jù)類型int32 / string …和特殊類型枚舉、其他 message 等字段唯一編號(hào)用來(lái)標(biāo)識(shí)字段一旦投入使用就不能改改了等于換了字段。標(biāo)量類型對(duì)照表以 C 為例.proto Type說(shuō)明C Typedouble8 字節(jié)浮點(diǎn)doublefloat4 字節(jié)浮點(diǎn)floatint32變長(zhǎng)編碼。負(fù)數(shù)的編碼效率較低——字段可能為負(fù)時(shí)應(yīng)用sint32int32int64變長(zhǎng)編碼。負(fù)數(shù)的編碼效率較低——字段可能為負(fù)時(shí)應(yīng)用sint64int64uint32變長(zhǎng)編碼uint32uint64變長(zhǎng)編碼uint64sint32變長(zhǎng)編碼符號(hào)整型負(fù)值編碼效率高于int32int32sint64變長(zhǎng)編碼符號(hào)整型負(fù)值編碼效率高于int64int64fixed32定長(zhǎng) 4 字節(jié)。值常大于 2sup28/sup 時(shí)比uint32更高效uint32fixed64定長(zhǎng) 8 字節(jié)。值常大于 2sup56/sup 時(shí)比uint64更高效uint64sfixed32定長(zhǎng) 4 字節(jié)int32sfixed64定長(zhǎng) 8 字節(jié)int64bool布爾boolstringUTF-8 / ASCII 字符串長(zhǎng)度不超過(guò) 2sup32/supstd::stringbytes任意字節(jié)序列長(zhǎng)度不超過(guò) 2sup32/supstd::string關(guān)于變長(zhǎng)編碼Varint經(jīng)過(guò) PB 編碼后原本需要 4 字節(jié)或 8 字節(jié)的數(shù)可能只占 1~2 個(gè)字節(jié)。 這就是為什么int32 age 20;編碼出來(lái)只有一個(gè)字節(jié)——小數(shù)值極其省空間。 而負(fù)數(shù)在 Varint 里會(huì)被當(dāng)作 64 位補(bǔ)碼處理固定占 10 個(gè)字節(jié)所以可能為負(fù)的字段一定優(yōu)先選sint32/sint64。另注bytes在 C 里同樣映射為std::string但語(yǔ)義是裸字節(jié)不要直接當(dāng)文本用。更新contacts.proto加入姓名與年齡syntax proto3; package contacts; message PeopleInfo { string name 1; int32 age 2; }字段編號(hào)的兩個(gè)硬性約束A. 取值范圍1 ~ 536,870,911即 2sup29/sup ? 1其中 19000 ~ 19999 不可用。19000~19999 是 PB 協(xié)議實(shí)現(xiàn)內(nèi)部預(yù)留的。硬寫上去編譯期就會(huì)告警// 消息中定義了如下編號(hào)代碼會(huì)告警 // Field numbers 19,000 through 19,999 are reserved for the protobuf implementation string name 19000;B. 1 ~ 15 編號(hào)只占 1 個(gè)字節(jié)16 ~ 2047 占 2 個(gè)字節(jié)。編碼后的字節(jié)不僅包含編號(hào)還包含字段類型wire type。所以1 ~ 15 應(yīng)該留給出現(xiàn)最頻繁的字段同時(shí)為將來(lái)可能新增的高頻字段預(yù)留幾個(gè)低編號(hào)。這是一條協(xié)議設(shè)計(jì)時(shí)就要想清楚的性能約束不是編譯器會(huì)幫你兜底的東西。Step 7編譯contacts.proto命令行格式protoc [--proto_pathIMPORT_PATH] --cpp_outDST_DIR path/to/file.proto參數(shù)含義參數(shù)說(shuō)明protocProtocol Buffers 提供的命令行編譯工具--proto_path/-I指定被編譯.proto文件所在目錄可多次指定。不指定則默認(rèn)在當(dāng)前目錄搜索。當(dāng).proto之間互相import或被編譯文件不在當(dāng)前目錄時(shí)必須用-I--cpp_outOUT_DIR指定生成C代碼以及輸出目標(biāo)目錄path/to/file.proto要編譯的.proto文件編譯我們的通訊錄protoc --cpp_out. contacts.proto生成兩個(gè)文件contacts.pb.h // 類的聲明 contacts.pb.cc // 類的實(shí)現(xiàn)生成代碼的整體規(guī)律每個(gè)message→ 生成一個(gè)對(duì)應(yīng)的消息類類里為每個(gè)字段提供getter / setter以及一系列操作字段的方法每個(gè).proto文件 → 一對(duì).h/.cc聲明與實(shí)現(xiàn)分離。Step 8讀懂生成的代碼contacts.pb.h片段class PeopleInfo final : public ::PROTOBUF_NAMESPACE_ID::Message { public: using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; void CopyFrom(const PeopleInfo from); using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; void MergeFrom(const PeopleInfo from) { PeopleInfo::MergeImpl(*this, from); } static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { return PeopleInfo; } // string name 1; void clear_name(); const std::string name() const; template typename ArgT0 const std::string, typename... ArgT void set_name(ArgT0 arg0, ArgT... args); std::string* mutable_name(); PROTOBUF_NODISCARD std::string* release_name(); void set_allocated_name(std::string* name); // int32 age 2; void clear_age(); int32_t age() const; void set_age(int32_t value); };命名規(guī)律一目了然getter名稱與字段名完全相同小寫如name()、age()setter以set_開頭如set_name()、set_age()每個(gè)字段都有clear_方法把字段重置回 empty 狀態(tài)字符串字段額外有mutable_/release_/set_allocated_用于避免拷貝或轉(zhuǎn)移所有權(quán)——mutable_name()返回可直接修改的內(nèi)部指針級(jí)對(duì)象這是高頻修改字符串時(shí)唯一不產(chǎn)生拷貝的入口。contacts.pb.cc中是這些方法的具體實(shí)現(xiàn)通常不需要看。序列化 / 反序列化 API 在哪不在消息類自己身上而在其父類MessageLite中class MessageLite { public: // 序列化 bool SerializeToOstream(ostream* output) const; // 寫入文件流 bool SerializeToArray(void* data, int size) const; bool SerializeToString(string* output) const; // 反序列化 bool ParseFromIstream(istream* input); // 從流讀取再反序列化 bool ParseFromArray(const void* data, int size); bool ParseFromString(const string data); };四個(gè)要點(diǎn)序列化結(jié)果是二進(jìn)制字節(jié)序列不是文本格式三個(gè)序列化方法沒有本質(zhì)區(qū)別只是輸出載體不同流 / 裸內(nèi)存 / string按場(chǎng)景選序列化 API 都是const成員函數(shù)——序列化不改變對(duì)象內(nèi)容只把結(jié)果寫到入?yún)⒅付ǖ牡刂犯暾?message API 見官方 Message 完整列表。Step 9序列化與反序列化的實(shí)際使用運(yùn)行結(jié)果第二部分Muduo2.1 Muduo 是什么解決什么問題Muduo 是陳碩開發(fā)的、基于非阻塞 IO 與事件驅(qū)動(dòng)的 C 高并發(fā) TCP 網(wǎng)絡(luò)編程庫(kù)。它解決的是手寫網(wǎng)絡(luò)服務(wù)的經(jīng)典痛點(diǎn)裸用epoll時(shí)你得自己管理fd生命周期、處理EAGAIN/短讀短寫、維護(hù)每連接的緩沖區(qū)、處理跨線程喚醒……任何一個(gè)細(xì)節(jié)寫錯(cuò)都是線上事故。Muduo 把這一整套封裝成注冊(cè)回調(diào) 事件循環(huán)的編程模型。2.1.1 主從 Reactor 模型main Reactor只有一個(gè)專職accept新連接然后把連接分發(fā)給某個(gè) sub Reactorsub ReactorN 個(gè)各自跑在自己的線程里負(fù)責(zé)已建立連接的讀寫事件與業(yè)務(wù)回調(diào)。2.1.2one loop per thread線程模型的核心約定一個(gè)線程只能有一個(gè)事件循環(huán)EventLoop用于響應(yīng)計(jì)時(shí)器和 IO 事件一個(gè)文件描述符只能由一個(gè)線程進(jìn)行讀寫——換句話說(shuō)一個(gè) TCP 連接必須歸屬于某個(gè) EventLoop 管理。這條約定的工程價(jià)值因?yàn)檫B接只屬于一個(gè) loop業(yè)務(wù)回調(diào)天然是單線程串行執(zhí)行的。 你在onMessage里操作連接自己的狀態(tài)時(shí)不需要加鎖 需要跨線程操作時(shí)Muduo 提供runInLoop/queueInLoop把任務(wù)丟回目標(biāo) loop 執(zhí)行這也是定時(shí)器能線程安全地從其他線程調(diào)用的原理。并發(fā)難點(diǎn)從到處鎖變成了想清楚哪些變量屬于哪個(gè) loop這是 Muduo 最舒服的地方。2.2 五個(gè)必須掌握的核心類類職責(zé)一句話記住InetAddress封裝 IP 端口描述哪個(gè)地址EventLoop事件循環(huán)epoll的封裝驅(qū)動(dòng)一切的心臟TcpServerTCP 服務(wù)器服務(wù)端入口負(fù)責(zé) accept 分發(fā)TcpClientTCP 客戶端客戶端入口負(fù)責(zé) connectTcpConnection一條TCP 連接收發(fā)數(shù)據(jù)都通過(guò)它Buffer每連接的讀寫緩沖區(qū)解決數(shù)據(jù)沒到齊/發(fā)不完CountDownLatch倒計(jì)時(shí)門閂把異步連接同步化2.2.1TcpServertypedef std::shared_ptrTcpConnection TcpConnectionPtr; typedef std::functionvoid (const TcpConnectionPtr) ConnectionCallback; typedef std::functionvoid (const TcpConnectionPtr, Buffer*, Timestamp) MessageCallback; class InetAddress : public muduo::copyable { public: InetAddress(StringArg ip, uint16_t port, bool ipv6 false); }; class TcpServer : noncopyable { public: enum Option { kNoReusePort, kReusePort, }; TcpServer(EventLoop* loop, const InetAddress listenAddr, const string nameArg, Option option kNoReusePort); void setThreadNum(int numThreads); // 設(shè)置 sub Reactor 線程數(shù) void start(); // 啟動(dòng)創(chuàng)建監(jiān)聽 socket 并注冊(cè)進(jìn) loop /// 當(dāng)一個(gè)新連接建立成功的時(shí)候被調(diào)用 void setConnectionCallback(const ConnectionCallback cb) { connectionCallback_ cb; } /// 消息的業(yè)務(wù)處理回調(diào)函數(shù)——收到新連接消息的時(shí)候被調(diào)用 void setMessageCallback(const MessageCallback cb) { messageCallback_ cb; } };要點(diǎn)三個(gè)入?yún)⒂媚膫€(gè) loop、監(jiān)聽地址、服務(wù)器名日志標(biāo)識(shí)setThreadNum(n)設(shè)置 sub Reactor 數(shù)量n 0就是單線程模式所有 IO 都在 main loop 里setConnectionCallback參數(shù)只有 1 個(gè)連接對(duì)象setMessageCallback參數(shù)有 3 個(gè)連接對(duì)象、Buffer、時(shí)間戳——這是新手最常見的編譯錯(cuò)誤來(lái)源kReusePort設(shè)置SO_REUSEPORT服務(wù)器重啟不必等TIME_WAIT超時(shí)調(diào)試期建議開。2.2.2EventLoopclass EventLoop : noncopyable { public: /// Loops forever. /// Must be called in the same thread as creation of the object. void loop(); /// Quits loop. /// This is not 100% thread safe, if you call through a raw pointer, /// better to call through shared_ptrEventLoop for 100% safety. void quit(); TimerId runAt(Timestamp time, TimerCallback cb); /// Runs callback after c delay seconds. Safe to call from other threads. TimerId runAfter(double delay, TimerCallback cb); /// Runs callback every c interval seconds. Safe to call from other threads. TimerId runEvery(double interval, TimerCallback cb); /// Cancels the timer. Safe to call from other threads. void cancel(TimerId timerId); private: std::atomicbool quit_; std::unique_ptrPoller poller_; // 對(duì) epoll 的封裝 mutable MutexLock mutex_; std::vectorFunctor pendingFunctors_ GUARDED_BY(mutex_); };要點(diǎn)loop()是死循環(huán)阻塞接口必須與創(chuàng)建該對(duì)象的線程相同線程歸屬約定quit()用來(lái)退出定時(shí)器三件套runAt絕對(duì)時(shí)間、runAfter延遲一次、runEvery周期注意線程安全注釋定時(shí)器接口是可從其他線程安全調(diào)用的實(shí)現(xiàn)方式就是把回調(diào)queueInLoop到目標(biāo) looppendingFunctors_mutex_就是跨線程任務(wù)的落地機(jī)制也是eventfd喚醒epoll_wait的觸發(fā)點(diǎn)GUARDED_BY(mutex_)是 clang 線程安全注解告訴靜態(tài)分析這個(gè)成員必須在持鎖下訪問。2.2.3TcpConnectionclass TcpConnection : noncopyable, public std::enable_shared_from_thisTcpConnection { public: /// Constructs a TcpConnection with a connected sockfd /// User should not create this object. TcpConnection(EventLoop* loop, const string name, int sockfd, const InetAddress localAddr, const InetAddress peerAddr); bool connected() const { return state_ kConnected; } bool disconnected() const { return state_ kDisconnected; } void send(string message); // C11 void send(const void* message, int len); void send(const StringPiece message); // void send(Buffer message); // C11 void send(Buffer* message); // this one will swap data void shutdown(); // NOT thread safe, no simultaneous calling void setContext(const boost::any context) { context_ context; } const boost::any getContext() const { return context_; } boost::any* getMutableContext() { return context_; } void setConnectionCallback(const ConnectionCallback cb) { connectionCallback_ cb; } void setMessageCallback(const MessageCallback cb) { messageCallback_ cb; } private: enum StateE { kDisconnected, kConnecting, kConnected, kDisconnecting }; EventLoop* loop_; ConnectionCallback connectionCallback_; MessageCallback messageCallback_; WriteCompleteCallback writeCompleteCallback_; boost::any context_; };要點(diǎn)不要自己 newTcpConnection——它由TcpServer/TcpClient內(nèi)部創(chuàng)建用shared_ptr管理生命周期繼承enable_shared_from_this回調(diào)里需要續(xù)命時(shí)用shared_from_this()拿到shared_ptr避免對(duì)象在使用中被析構(gòu)send()是線程安全的內(nèi)部會(huì)runInLoop到所屬 loop 執(zhí)行可從任意線程調(diào)用shutdown()不是線程安全的且不能同時(shí)調(diào)用——這是注釋里明確寫的限制context_是boost::any類型的每連接用戶數(shù)據(jù)槽做連接級(jí)會(huì)話狀態(tài)用戶 ID、登錄態(tài)、解析中間態(tài)的標(biāo)準(zhǔn)位置四個(gè)連接狀態(tài)kDisconnected / kConnecting / kConnected / kDisconnecting業(yè)務(wù)里用connected()/disconnected()判斷即可。2.2.4TcpClientclass TcpClient : noncopyable { public: TcpClient(EventLoop* loop, const InetAddress serverAddr, const string nameArg); ~TcpClient(); // force out-line dtor, for std::unique_ptr members. void connect(); // 連接服務(wù)器 void disconnect(); // 關(guān)閉連接 void stop(); // 獲取客戶端對(duì)應(yīng)的通信連接 Connection 對(duì)象 // 注意發(fā)起 connect 后有可能還沒有連接建立成功 TcpConnectionPtr connection() const { MutexLockGuard lock(mutex_); return connection_; } /// 連接服務(wù)器成功時(shí)的回調(diào)函數(shù) void setConnectionCallback(ConnectionCallback cb) { connectionCallback_ std::move(cb); } /// 收到服務(wù)器發(fā)送的消息時(shí)的回調(diào)函數(shù) void setMessageCallback(MessageCallback cb) { messageCallback_ std::move(cb); } private: EventLoop* loop_; ConnectionCallback connectionCallback_; MessageCallback messageCallback_; WriteCompleteCallback writeCompleteCallback_; TcpConnectionPtr connection_ GUARDED_BY(mutex_); };注意Muduo 不管服務(wù)端還是客戶端連接動(dòng)作都是異步的。/* 因?yàn)?muduo 庫(kù)不管是服務(wù)端還是客戶端都是異步操作 對(duì)于客戶端來(lái)說(shuō)如果我們?cè)谶B接還沒有完全建立成功的時(shí)候發(fā)送數(shù)據(jù) 這是不被允許的。 因此我們可以使用內(nèi)置的 CountDownLatch 類進(jìn)行同步控制。 */connect()只是發(fā)起連接就返回了connection()可能還是空的。要連上再發(fā)就得用CountDownLatch把異步變同步class CountDownLatch : noncopyable { public: explicit CountDownLatch(int count); void wait() { MutexLockGuard lock(mutex_); while (count_ 0) { condition_.wait(); // 等待方阻塞直到計(jì)數(shù)歸零 } } void countDown() { MutexLockGuard lock(mutex_); --count_; if (count_ 0) { condition_.notifyAll(); // 通知方歸零時(shí)喚醒所有等待者 } } int getCount() const; private: mutable MutexLock mutex_; Condition condition_ GUARDED_BY(mutex_); int count_ GUARDED_BY(mutex_); };用法就是經(jīng)典的主線程 waitIO 線程在onConnection里 countDownCountDownLatch latch(1);→latch.wait();卡住 → 連上后回調(diào)里latch.countDown();→ 主線程被喚醒此刻連接一定可用了。注意條件的檢查方式是while (count_ 0)而非if——這是防虛假喚醒的標(biāo)準(zhǔn)寫法自己寫條件變量時(shí)照抄。2.2.5Bufferclass Buffer : public muduo::copyable { public: static const size_t kCheapPrepend 8; static const size_t kInitialSize 1024; explicit Buffer(size_t initialSize kInitialSize) : buffer_(kCheapPrepend initialSize), readerIndex_(kCheapPrepend), writerIndex_(kCheapPrepend) {} void swap(Buffer rhs); size_t readableBytes() const; // 可讀字節(jié)數(shù) size_t writableBytes() const; // 可寫字節(jié)數(shù) const char* peek() const; // 可讀數(shù)據(jù)的起始位置 const char* findEOL() const; // 找 \n解析文本協(xié)議常用 const char* findEOL(const char* start) const; void retrieve(size_t len); // 消費(fèi) len 字節(jié) void retrieveInt64(); void retrieveInt32(); void retrieveInt16(); void retrieveInt8(); string retrieveAllAsString(); // 取走全部可讀數(shù)據(jù) string retrieveAsString(size_t len); void append(const StringPiece str); void append(const char* /*restrict*/ data, size_t len); void append(const void* /*restrict*/ data, size_t len); char* beginWrite(); const char* beginWrite() const; void hasWritten(size_t len); // 讀完之后告知我寫了 len 字節(jié) void appendInt64(int64_t x); // 網(wǎng)絡(luò)字節(jié)序?qū)懭?void appendInt32(int32_t x); void appendInt16(int16_t x); void appendInt8(int8_t x); int64_t readInt64(); // 網(wǎng)絡(luò)字節(jié)序讀出 int32_t readInt32(); int16_t readInt16(); int8_t readInt8(); int64_t peekInt64() const; // 只看不消費(fèi) int32_t peekInt32() const; int16_t peekInt16() const; int8_t peekInt8() const; void prependInt64(int64_t x); // 前插常用于把長(zhǎng)度頭補(bǔ)回前面 void prependInt32(int32_t x); void prependInt16(int16_t x); void prependInt8(int8_t x); void prepend(const void* /*restrict*/ data, size_t len); private: std::vectorchar buffer_; // 底層存儲(chǔ) size_t readerIndex_; // 讀位置 size_t writerIndex_; // 寫位置 static const char kCRLF[]; };設(shè)計(jì)要點(diǎn)readerIndex_ / writerIndex_ 雙指針把vector分成已讀廢棄區(qū) | 可讀數(shù)據(jù)區(qū) | 可寫空閑區(qū)三段避免每次讀都erase搬內(nèi)存kCheapPrepend 8前面預(yù)留 8 字節(jié)廉價(jià)空間用于prepend補(bǔ)協(xié)議頭如長(zhǎng)度字段而不用整體搬移kInitialSize 1024初始 1KB按需擴(kuò)容這點(diǎn)很關(guān)鍵TCP 是字節(jié)流一次read不保證拿到一條完整消息Buffer 就是用來(lái)攢夠一條消息的appendInt32/readInt32系列自動(dòng)做網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換自定義二進(jìn)制協(xié)議時(shí)直接用它寫長(zhǎng)度前綴比手寫htons安全retrieve 消費(fèi)數(shù)據(jù)移動(dòng)readerIndex_peek 看一眼不消費(fèi)注意區(qū)分這是解析消息時(shí)最容易寫錯(cuò)的地方。2.3 快速上手英譯漢 TCP 服務(wù)端 / 客戶端用 Muduo 實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的英譯漢服務(wù) 客戶端發(fā)一個(gè)詞 → 服務(wù)端查字典 → 把譯文發(fā)回客戶端。2.3.1 服務(wù)端server.cpp幾個(gè)容易被忽略的細(xì)節(jié)成員聲明順序 構(gòu)造順序_baseloop必須寫在_server前面因?yàn)開server構(gòu)造時(shí)要用_baseloop。寫反了就是拿未初始化對(duì)象取地址行為未定義。InetAddress(port)這種只傳端口的寫法等價(jià)監(jiān)聽本機(jī)所有網(wǎng)卡要限定 IP 就寫InetAddress(0.0.0.0, port)。onMessage里msg.back()前應(yīng)判空如果對(duì)端只發(fā)了連接不發(fā)數(shù)據(jù)或發(fā)來(lái)空包back()是 UB。生產(chǎn)代碼要寫成if (msg.empty()) return;。同樣這里用retrieveAllAsString()是假設(shè)一次收到一條完整消息的偷懶寫法真實(shí)協(xié)議必須自己按長(zhǎng)度/分隔符做拆包配合findEOL()或readInt32()長(zhǎng)度前綴。send()不保證立刻發(fā)出內(nèi)核發(fā)送緩沖區(qū)滿時(shí)數(shù)據(jù)會(huì)留在 Muduo 的輸出 Buffer 里等EPOLLOUT所以別在send()后立刻假設(shè)對(duì)端已收到。2.3.2 客戶端client.cpp客戶端設(shè)計(jì)的三個(gè)關(guān)鍵點(diǎn)EventLoopThread客戶端通常沒有 main loop 需求用一個(gè)EventLoopThread起一個(gè)后臺(tái)線程跑 loop主線程就可以自由地做cin、等待等阻塞操作同時(shí)_baseloop上的 IO 照常進(jìn)行。 成員聲明順序上_loopthread必須在_baseloop之前、_baseloop必須在_client之前_baseloop(_loopthread.startLoop())才能拿到合法的 loop 指針。CountDownLatch才是主角_client.connect()是異步的直接send會(huì)被 Muduo 拒絕或丟數(shù)據(jù)。構(gòu)造函數(shù)里_connect_latch(1)→connect()里wait()→onConnection里countDown()三步把連接成功這件事變成一次確定的同步點(diǎn)。_conn的生命周期onConnection斷開分支里_conn.reset()translate里if (_conn)兜底判空——連接還沒建好或已斷開時(shí)只能安全地什么都不發(fā)。2.3.3 編譯Makefile運(yùn)行效果
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲 欧美日韩 另类| 国产人妻一区二区三区欧美毛片| 野狼福利社区| 91欧美美女日韩国产婷婷| 377p欧洲日本亚洲大胆| 91爱啪| 少妇诱惑视频| 亚洲高清无码免费观看视频| 成人五月天丁香激情综合| 99999精品成人| 粉嫩不卡一区二区性爱| 欧在线一二区| 亚州欧美综合| 求求你操操我| 懂色AV一区二区三区| 综合久久久久久久久91| 在线色资源| 中文字幕 人妻不满 在线视频| 中文久久| 综合亚洲欧美| 青青草影视蜜久久| 色综合99999| 日本视频在线观看污污污| 蜜臀va69| 大香蕉日亚洲日本亚大| 中文字幕一区 二 区 三 四 五 区日 日 骚| 成人97人人超碰人人| 精品国产乱码久久久影院| 成人精品电影| 色5月婷婷| 欧亚乱色熟女一区二区| 无码天天操| 青青免费在线视频一区 | 三级片大波波| 蜜乳Av成人片网站| 97视频www| 大香蕉亚洲中文| 竹菊一区二区三区AV线| 伊人久久大香线综合无码| 男人的天堂在线有码| 亚洲黄色a级片| 欧成人精品H无码| 伊人久大| 日本成人在线不卡一区二区三区 | 亚洲精品一二三四区| 国产精品午夜精品| 婷婷久久综合| 1000部熟女视频在线观看| 自拍欧美| 日韩中文字幕在线视频观看| 亚洲中字慕不卡| 很很干很很操| 超碰成人免费| 再深点灬舒服灬太大了好硬好爽| 中文字幕精品一区欧美| 亚洲日韩XXX| 五月天婷婷久久| 欧美人妻一区二区| 青青青国产| 伊人精品久久网站| 热久久无毒不卡| 五月天激情视频| 中文字幕久久婷婷丁香五月天| 蜜臀AV一区二区三区| 色天堂在线观看| 日本在线999| 久久无码一区二区二三区性色| 人人操人人插人人摸人人干| 九久9精品| 熟女一区二区| 免费超碰97久久| 久久神马| 婷婷色在线| 黄色不卡视频| 黄色免费网| 91精片| 夜夜嗨AV一区天天| 国内偷拍精品一区二区| v91av| 78超碰| 啪啪性爱免费视频| 色综合尤物| 九久9热| 玖玖资源视频一区二区三区| 性videos欧美熟妇hdx| 欧亚免费视频| 午夜AV污污污| 在线色导航| 欧美不卡在线美女| 超碰99在线| xxx0国产在线播放| 无码人妻丰满熟妇奶水区毛片| 成人精品水蜜桃久久久久久久| 97手机日韩| 91人妻Pr| 97在线免费公开视频| 先锋色眉乱伦资源| 欧美操逼视频二区| 亚洲国产综合视频| 欧美另类色图片| 亚洲精品97p| 精品亚洲国产成人精品| 东北女人的毛片| 国产精品操| 日韩AV一起草| 欧美97se| 六月丁丁香| 一本大道久| 国产人伦a片信息免费片| 欧美色图天堂网m| 五月丁香激情四射| 国产视频三区四区| 亚洲巨爆乳一区二区三区四季网| 午夜久久一区二区无码中出| 久久久久99999| 色婷婷狠狠| 亚洲精品久久久久久| 亚洲欧美日韩精品久久久一区二区| 草伊人高潮喷水超碰| 内射老妇BBWX0C0CK| 亚洲天堂电影精品一区| 欧美91色| 新版天堂中文资源8在线| 丝袜色综合| 亚洲天堂东京热| 成年人免费观看网站| 欧美97视频| 国产精品呦一区二区三区| 日韩资源网| 午夜理论片在线观看免费| 日韩精品电影| 六月婷婷色综合| 美女让帅哥通她小鸡鸡| 色99色| 久久天堂| 少妇久久久免费| 色情婷婷| 国产无码精品高清| 91天堂丝袜美腿| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 国产亚洲精品美女久久久久久2021| 久久伊人青青草| 亚洲欧美国产其他二区| 日本操逼视频免费| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 伊人精品视频| 精品超碰中文在线| 日本高清_区二区三区| 三级色影综合网| 国产青视频| 综合熟女| 欧美黄色片AAAAA| 少妇一级无码精品| www国产精品| AV色五月| 伊人网在线观看| 丰满人妻-区二区三区免费| 伊人国产视频| 欧美丝袜激情| 99久久网站| 7777奇米影视久久| 加勒比综合| 欧美日韩美女精品久草一区二区三区| 男人天堂站| 尤物国产一区在线观看| 超碰在线一区二区| 亚洲一区二区三区婷婷| 午夜福利合集| 久草电影网| 国产AV人人夜夜澡人人爽麻豆| 97视频网站在线观看| 欧美日韩第一页| 人人人人插| 超碰97人人cao| 91久久| 97热视频在线观看| 麻豆国产成人精品| 伊人网在线视频| 一区二区 电影 亚洲| 怡红院怡春院| 丁香婷婷激情五月天无毒不卡 | 99操| 可以在线观看AV的网站| 国产 日韩 欧美高清| 91视频伊人| 国产一区二区免费福利片| 84YTCOM性无码| 综合亚洲欧美精品日韩?v| 色在线视频导航| 欧美人妻少妇| 无码区蜜乳| 人人摸人人添人人操| 亚洲天堂AV在线播放| 97人妻免费中文字幕| 影音先锋乱| 久久久激情| 人妻天天爽夜夜爽爽| 禁十八久久| 亚洲少妇激情一区二区三区| 亚洲欧美黄| 色屁屁影院www国产| 免费观看国产不卡av| 亚洲熟女中文字幕在线| 中文字幕 av v| 四虎免费看黄| 欧美高清在线| 亚洲网站一区二区在线| 亚洲人妻中文高清| 国产精品老熟女一区二区| 国产高清不卡视频| 熟女少妇视频| 日本Xx性爱| 精品久久視頻在线| 色悠久久久av| 98人妻精品一区二区色欲| 在线国产一区二区av| 欧美 亚洲 制服 精品| 很很很很操| 九九九九精品| 91美女中出| 91精品久久久久久久久久| 国产精品96| 国产农村一一级特黄毛片| 精品国产99| 久久精品噜噜噜成人看免欧美大片| 久久久久亚洲Av无码专区老牛影视 | 97久久综合网| 熟女人妇一区二区三区| 激情欧美日韩女同久久| 亚洲中文字幕熟女| 久操热线| 中文有码9| 日韩人成网站在线播放| 亚洲欧美精品久| 欧美十八禁视频| 久久国产精品一级二级三级| 日韩av一级黄片| 久9九综合在线| 自拍偷拍国产欧美日韩韩| 99re这里只有| 国产欧美一区二区| 老熟女91视频| 麻豆人妻精品一区二区| 13小男生GAY自慰脱裤子| 性爱乱伦网址| 一区在线观看中文字幕| 操逼日韩无码 | 亚洲天堂男人天堂网| yw尤物av无码点击进入麻豆| 日韩欧美成人大香蕉| 欧美超碰96| 中文字幕av亚洲在线| 99久久无码| 亚洲天堂一二| 国产精品久久久久久久久久久久久久久久| 夜色AV无码手机在线影院| 欧美成人精品欧美一级乱黄一区二…| 欧美十八禁视频| 欧美日韩久久精品爱爱| 又黄又爽在线观看视频| 亚洲精品国产精品成人| 久超超碰| 日日日日做夜夜夜夜无码| 国产农村妇女精品一| 91伊人久| 精品欧美日韩在线观看| 岛园激情| 久久久96| 午夜精品人妻二区三区| 色综合久| 丝袜足交视频| 亚洲人妻熟妇三十三区| 国产成人免费观看在线视频| 久久二| 天天看综合网| 丁香九月 婷婷| 97视频在线免费播放| 日韩乱插| 精品无吗m| 亚洲永久AV无码精品秋霞| www.av在线视频| 综合情欲网| 91在线欧色| 影视综合无码少妇| 亚洲在线综合| 啊操爽品善一区二区三区| 亚洲 欧美日韩 另类| 成人三级片一区二区三区视频| 欧美亚洲激情小说| 搡老人老9丨女老熟人| 大香蕉视频一二三区| 伊人九九九| 欧美97在线观看| 99久久久久久久久| 日韩黄色电影网站| 嗯~啊~快点 死我视频免费看网站| 色久桃花影院在线观看| 欧美色蜜桃97| 国产精品久久久久久久久久久久久久久久 | 欧美后入| 中文字幕av一区二区三区人妻少妇 | 色偷偷人人玩人人舔人人操人人摸人人爽| 久久亚洲精品成人av| 久久久9999| 亚洲色图伊人网| 亚洲精品丝袜| 亚洲AV无码成人精品久久| 狠狠入| 久久久久ab| 色99色| 成年人三级黄色片视频| 欧美人妻制服| 97欧美色综合| 东北老女人的激情视频| 天天插天天干| 熟女精品一区二区三区| 日韩欧美中文日韩欧美色| 操逼逼中文字幕| 熟女精品一区二区三区| 免费在线观看国内色片网站网址| 67194无码不卡| 久久激情网| 草草影院最新网址| 亚洲乱色熟女一区| 操东北女人| 330dv亚洲成年视频网| 久久熟女人| 欧美网站免费| 性做久久久久久久| 不卡av在线中文字幕| 东北女人操逼| 天美传媒麻豆一区二区三区国产精| 丁香婷婷激情五月天无毒不卡| 大香交伊人网| 成人AV在线电影| 日本熟妇人妻中出视频| 乱伦Av网| 欧美色性爱| 超碰在线香蕉| 色牛牛AV| 少妇超碰在线| 日日天天久久啊啊aaa| 中文字幕一二三区| 97超碰色屌| 草久久久| 亚洲啪啪啪啪视香蕉| 日日日大屁股骚女人精品| 青青伊人加勒比海| 亚洲素人综合| 美女t无毒不卡不卡| 国产97av| 亚洲精品久久久久毛片A片拉屎 | 久久一区二区高清免费| 国产白嫩漂亮KTV在线| 久久夜黄色无码A级大片| 99国产在线 精品 视频| 久久久无码av精| 亚洲欧美中文日韩视频中国语| 青青草天天亲夜夜操网| 欧洲色色| 成人网欧美风情| 啊啊啊不要啊啊受不了了视频在线| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 国产嫩草精品A88AV在线| 日韩三级在线观看mp4| 嗯嗯啊好大| 激情四射婷婷六月天| 久久精品女同亚洲女同13| 亚洲色婷婷综合久久久久中文| 欧美色另类| 色哟哟 日韩精品| 国产一区在线观看无码AV| 国产1769在线| 殴美,日韩国产伦精品| 欲射影视| 超碰久超碰久| 思思热在线视频免费| 一区操逼日比视频| 国模一区二区三区| 欲香欲色天天天综合和网| 一区二区亚州激情久婷婷欧美| 欧美综合网站999| 老女人综合网| 日本一级黄色电影| 最新av在线| 校园春色AV天堂| 人人干人人操人人爱| 一级久久久久久久久久久| 大奶啊啊好爽| 亚洲综合射| 成人怡红院| 先锋色眉乱伦资源| 日韩性色b| 九九九九一级| 草草草视频在线免费看| aaa一级黄片| 色眯眯射| 黄色工厂这里只有精品| 思思热国产在线视频| 日韩人妻大香蕉| 99蜜桃臀久久久欧美精品网站| 日韩有码中文字幕女同性恋| 欧美日本中字另类在线| 96久久科窝| 中文字幕一品色图| 韩国黄片aaaa| 亚洲人在线成线成人| 午夜操操操| 蜜乳av一区二区| 亚洲精品 大香蕉| 超碰一区二区| 小日子操bb在线看| 熟妇熟女亚洲天堂网| 国产AB视频| 日韩欧美大力操| 大香蕉宗合网在线| 97伊人超碰| 日本三级网页| 天天操美美| 亚洲欧洲中文日韩女优乱码| 日本久操视频| 九九九精品美女| 久久人人爽人人爽人人片Ⅴ| 日影院久久婷婷夜夜网| 91大神精品长腿在线观看网站| 狼人久草| rivers-china.com| 免费看一级a性色生活片久久无| 国内毛片四区| 四虎在线播放| 国产成人精品必看 | 久久蜜色情在线视频xxx免费观看| 亚洲无码日韩电影| 91超级碰碰| 久久久国产护士丝袜美腿一| 无码高清专| 亚洲熟久久| 中文字幕,人妻,日韩| 97国产色综合| 国产性爱强奸乱伦大全| 欧美日韩国产中文超碰| av中亚| 亚洲综合小说另类图欧美视频激情小说色五月天| 天操天操夜操夜月月年年操操| 黄色视频60分钟| 中文有码第五页| 2021国产成人精品久久| 九月丁香婷婷| www.亚洲黄色| 亚av顶级裸体一区二区三区四区五区| 欧洲欧美视频一区二区| 日韩美女,国产传媒,视频一区| 操逼逼一区视频| 熟妇高潮一区二| 成人无遮挡毛片免费看| 狠狠图片青青草| 1人人看人人摸人人操| 一区二区三区四区久久视1| 眼镜人妻101.com| 大香蕉男人的天堂| 日本人人操人人操| 老司机香蕉| 六六久久日韩不卡| 狠狠婷婷亚洲中文综合久久| 天天夜夜久久| 高清无码 国产精品| 日日嗷| av九九| 日本一级真人黄色性爱视频| 日日AV加勒比| 91强热人妻| 五月天日日操夜夜操| 亚洲操操| 超碰精品97| 日韩一级二级三级在线不卡观看完整| 免费av大片| 少妇人妻精品| 中文字幕亚洲永久精品| 97精品网站| 国产一级片| 日韩一级欧美一级国产一级台湾| 9超碰免费| 美女操逼福利视频| 日本不卡在线二区三区| 亚洲高清内射| 亚洲精品乱码久久久久久蜜桃麻豆| 日曰骚久久精品| 亚洲另类久操网| 精品视频免费在线一区| 国产综合久| 色诱中文字幕| 亚州AV无码国产精品| 一二三区精品视频| 东京热av男人的天堂| 日韩黄色电影网站| 丝袜人妻av一区二区| 欧美精品久久| 国产女人高潮视频| 99在线无码精品秘 入口黑人| 午夜亚洲| av72网| 欧美久热| 九九久久一区二区伦理| 天天色欧美| 亚洲综合九| 大香蕉免费中文| 手机在线播放国产福利| 国产99热| 国产中午字一暮区| 97 视频在线| 久久久五月天| 国产精品69人妻无码久久久| 久操精品| 欧美96在线|欧| 亚洲AV不卡在线观看尤物| 狠狠穞A片一區二區三區| 中文字幕一区二区在线日韩精品| 青草精品视频日本久久久久网站在线| 99精品久久久久久| 91新在线欧美| 久久超碰爱| 色牛牛AV| 欧美成人性爱视频免费观看| 午夜福利国产欧美日韩夜夜| BBBBB97COM| 国产精品一级二级在线| 天天α片| 国产夜夜操| 狠狠综合网| 色噜噜人妻丝袜a∨先锋影| 天天爽夜夜爽夜夜爽精| 中文乱码字字幕在线第5页| 强乱老妇中文字幕| 久久久久极品| 久湿久久| 久久夜精品一区二区三区| 99啪啪视频| 亚洲综合97中文网| 五月婷婷激情综合| 综合久久中文字幕综合日韩精品| 五月丁香拍拍激情综合三级| 一级@啪啪视频| 国产精品久久久久久久无码AV| 美女啊啊啊啊啊啊| 久久伊人影院| 亚洲色图欧美| 97资源久久| 亚洲高清欧美总合| 久久久久熟女| 深夜国产福利| 91美女小视频| 亚洲欧美情色| 熟女人妻一区二区三区免费看| 欧美性色欧美| 91宗合网| 91视频综合网| aa片毛片| 无码精品久久| 又大又长又粗又爽又黄| 日韩图区 偷拍| 欧美成人A天堂片在线观看| 日韩无码精品综合久久| 国产AV色黄看到爽| 成人七区| 五月天玖玖资源站| 九九RE视频在线精品| 狠狠爱综合| 99热免费| 欧美成人亚洲精品| 欧美国产有色电影| 激情久久日韩精品中文字幕麻豆| #NAME?| 天天干18禁| 九九九久久久| 午夜福利无毒不卡| 在线看片国产精品每日更新| 视频分类 国内精品| 久久精品99| 一区二区三区在线资源| 夜夜操老骚逼视频网站| 欧洲一区二区三区免费| 天美麻豆黄色录像| 青青在线视频免费| 日韩成人高清一区二区| 日韩精品国产一区二区| 国产呦精品一区二区三区下载| 国产精品电影| 亚洲综合网图| 国产和美国毛片| 国产激情在线| 欧美岛国精品在线观看| 欧美一级久久久久久久大片动画| 不卡啪啪视频| 99久久久无码| 男人的天堂2000| 天天影视91看看| 久久久九九九| 成人5码视频| 久久久久久午夜男人的天堂| 狠狠热这里都是精品| 舔舔啊| 蜜臀久久99精品久久久久久无删减 | 久久性爱城| 日本久久久久久久久| WWW.加勒比人妻一区不卡.com| 91天天美女| 午夜精品久久一区二区| 天天做日日做天天欢。| 看看小穴| 欧美一区二区三熟女剧情| 亚洲在线a| 亚洲第一精品在线视频| 看日韩美女二区三区免费操逼视频| 日韩一级二级在线| 国产夫妻性生活视频| 狠狠婷婷亚洲中文综合久久| 国产综合久久久鬼色| 色综合网1| 九九英色视频| 94色色电影网| 三级三级三级a级全黄三| 欧美精品成人亚洲| 日本2020一区二区| 伦伦成年午夜免费视频| 91超碰人人| 精品一区二区2| 香伊人在线| 丝袜 亚洲 偷拍| 欧美体内射精| 综合国产影视三级| 丝袜熟女2P| 久久婷婷一区| 亚洲AV无码黄色强奸| 国产有码一区| 欧美人妻少妇| www.激情| 人妻少妇久久| 日韩中文字幕人妻视频| 蜜臀在线免费观看在线免费观看| 黄色成年| 欧美很很操视频| 新视频sss国产| 边做饭边操逼逼| 久久黄黄| 色香天天| 婷婷性爱| 超碰97综合网| 伊人女女资源在线观看| 久久99草| 成人小说视频在线精品欧美| 污到发麻的视频 国产| www亚洲欧美| 欧美日韩999| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 91欧美高清| 怡红院成人视频| 欧美人人AAA| 国产AB视频| 亚洲成人久久一区二区| 久久大陆| 中文字幕交换人妻| 人妻黑丝袜电影| 又粗又长又爽在线观看| 超碰人妻中文在线| 日韩欧美午夜一区二区| 日本一区99| 中国操逼无码| 久久神马影院| 欧美天天干| 999 久久久| 亚洲天堂AV在线播放| 91精品国久久久久久无码| Av手机版天堂网| 久久综合女优| 国产91乱伦| 大屁股熟女一区二区三区| 国语国产操逼伊人AV网| 欧美在线综合| 亚洲国产欧美中文永久| 熟人人妻少妇精品久久| 五月激情小说| 白嫩少妇| 日韩99神马视频片| av天堂精品久久| Julia Annxxxxx| 国产人妻天天干精品| 婷婷久久久精品| 99热综合| 亚洲无码视频免费在线观看网址! J?P?NESEHD熟女熟妇伦 | 欧美熟爽综合| 国产精品嫩草影院午夜两性| 成熟熟女国产精品一区二区| 人妻aa| 0755午夜福利视频| 熟女人妻av在线资源,黄色的资源 粉嫩国产精品久久粉嫩 | 久久久久久久伊人精品| 午夜福利在线合集| 五月色网| 综合网亚洲| 麻豆精品A片免费观看| 亚洲成a人片在线观看中文!!!| 日韩精品一区,二区 九九...老司机| 亚洲操人| 久久91| 黑人精品久久97| 天天躁日日躁AAAXX| 亚洲欧美另类图片| 青娱乐蜜桃臀AV色婷| a v网站在线播放| 手机在线大香蕉| 亚洲三级网址久久最新| 國產尤物AV尤物在線觀看| 超碰碰97资源站| 亚洲精品天天影视综合网 | 插穴性爱视频在线观看| 精品无码少妇| 一区二区 电影 亚洲| 日本肏逼视频在线观看| 久久AV无码AV| 十八禁电影伊人网| 人妻激情另类| 岛国视频免费在线观看| 蜜桃久久一区二区| 制服中出中文人人精品| 熟女精品一区二区三区| 亚洲91在线播放影院| 国产精品丝袜在线| 婷婷另类小说| 色综合色色| 五月婷婷六月丁香网址| 日本在线伊人啪啪| 欧美少妇色综合| 操狠狠| 日本国产欧美高清在线| 免费操逼91| 久久久一二三四区| 9 7超碰在线免费观看| 日韩av乱伦| 国产日韩精品人妻久久久久色欲网站| 久久久啊啊啊| 操淫穴亚洲五月丁香| 91青视频| 色婷婷久久| 午夜精品五区| 午夜人人操| 夜夜欧美| com 首页 18岁 禁区 女优 免费 精选 同城 | 在线女人91| 蜜乳av首页| 波多野42部无码喷潮在线观看| 97欧美在线| 精品人妻一区二区三区蜜桃视频| 亚洲男人的天堂AV| 啊啊啊不要好疼视频| 婷婷中文网| 51久久夜色精品国产麻豆| 免费视频一二三区| 青女偷拍网| 日韩97精| 97超碰这里只有精品| 亚洲一二三四区机械| 亚州国产精品乱| 无遮挡猛进视频免费无限观看| 成人麻豆av电影网站| 视频国产成人精品日本亚洲18| 久久久日本电影| 欧美97se| 天天操熟妇| 蜜桃精品视频一区二区三区| 欧洲小说色图视频另类| 操b网站亚洲无码| 超碰在线974| 四虎影视在线| 97在线免费看| 天综合中文| 久久超碰爱| 亚洲性爱高潮影院| 九九热在线视频| 日本99视频| 五月丁香六月| 免费观看欧美日韩操逼视频| 色区久久| www.夜夜| 天美av在线观看| 国产欧美日韩女同性恋ww喷水精品 | 久久精品久久久久久久久| 欧洲性爱无码区| 国产精品高潮久久久无码| 97手机日韩| 中国人高清www色视频免费| 男人的午夜天堂| 97在线免费观看视频| 久久久亚洲熟妇熟女| 97精品免费| 亚州熟女乱伦| 91东京热男人的天堂| 日本欧美一区二区三区视频麻豆| 久久久久久久伊人精品| 亚洲第一精品在线视频| 欧美一级国产一级| 国产综合永久精品日韩鬼片| 亚洲日韩国产欧美综合v| 天天躁日日躁XXXXYY| av国产无码| a久久| 日韩人妻操B| 蜜臀亚洲中文| 久久草视频污视频| 热久久无毒不卡| 超碰吊日色| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 无码WWW免费视频网站| 亚欧性爱ab| 久久五月综合| 97青青操视频| 成人十八禁日韩欧美一二三| 中文无线日韩一区| 色吊丝 日日骚 清纯唯美| 中文视频在线观看| 岛国片在线播放| 欧美三级中文字幕hd| 久热这里| 超碰精品| 夜夜嗨一区二区三区三州加勒比| 亚洲色阁| 樱花蜜乳av| 色小视频蜜乳| 综精品久久久aaaa| 偷拍五区| 欧州91高潮| 国产极品精品美女视频| 91精品国产高清久久久久久,亚洲成人| 99热66| 啊啊啊97视频| 伊人欧美大香蕉视频| 超碰欧美| 亚洲综合精品国产一区| 97超碰jingpin| 热热热热日日漂亮永久永久国产日| 亚洲精品久久久久久| 熟女人妻精品一区二区视频| 亚洲自拍天堂| 激情五月婷婷| 麻豆精品天美| 久操免费在线| 夜色AV无码手机在线影院| 91视频国品一二三区| 久干网| 78久久| 亚乱色| 91AV老熟女视频| 久久久成人免费av电影| 狠狠操狠狠操操| 国产中文字幕曰本毛片| 91 丝袜在线| 黄页网站成人免费| 8x福利精品第一福利视频导航| 亚洲成av人片色午夜乱码| 色婷婷婷五月天激情四射| 亚洲情色 自拍| 欧美成人四级在线播放| 91 手机在线播放 绯色| 91碰碰| 欧美日韩大香蕉| 婷婷精品| 欧美极品少妇| 天天爽夜夜爽夜夜爽精| 一区二区偷拍拍视频| 日本不卡一区二区三区| 边做饭边操逼逼| 一级黄色影片| 久久人妻一区二区三区高清| av在线播放国产一区| 6080yy午夜理论三级一区二区三区无码| 激情人妻另类| 日韩字幕一区| 亚洲美乱| 亚洲 日本 不卡| 久久精品国产96精品亚洲拳交| 97久久精品国产| 一区二区中文| 一区二区激情国产熟女| 蜜臀99久久精品| 欧美强奸乱能| 欧美乱妇狂野欧美在线视频| 美国日韩黄片| 美女露胸露尿口| 丰满人妻一区二区三区免费 | 九九九网页| 激情欧美97| 色啪网| 91N综合网| 91人人臊| 超碰9 7女人| 人妻中文字幕日韩电影| 五毛骚逼极品美女怕怕| 隔壁邻居波多野结衣中文字幕 | 久热久| 麻豆国产视频精品观看| 91 国产丝袜在线放观看 | 婷婷av在线中文字幕| 日韩99999色| 97在线免费| 97中文超碰| 国产精品福利视频| 亚洲天堂中文字幕无码男同| 91性网| 女优视频第10页| 丰满人妻-区二区三区| 天天日天天插| 东京热毛片177b2viP| 大香蕉亚洲中文| 婷婷五月天激情四射| 久久久草成人网站久久久草成人久久久草久久久| 国产又粗又长的视频| 狠狠综合网| 无人区高清电影免费观看一区二区三 www.qmcai2.com | AV女优男人的天堂| 久久99热这里只频精品6学生| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 在线综合色| 玖玖超碰熟| 熟女乱伦二区| 亚洲精品97久久| 日本亚洲vr欧美不卡高清专区| 中文字幕丰满人妻日本| 色诱中文字幕| 少妇人妻太紧太深av| 囯产精品强| 亚洲av乱伦色图网站| 亚洲色电影在线| 久久熟女人| 久久久久久亚洲Av无码精| 久久中日麻豆| 国产黄色 A 片免费看| 久久精品女同亚洲女同13| 97干在线| A 天堂| 91精品婷婷国产综合久久竹菊| 午夜理论片在线观看免费| 后入合集| 91人妻视频在线| 欧美一级久久久久久久大片动画| AV久日| 香蕉在线一区二区三区| 高清无码久操视频| 狠狠做深爱婷婷久久二区| 久久 国产精品 一区| 日本506070| 手机久操欧美综合色码| 激情久久久| 亚洲色狠| 中文一区在线日| 99久久婷婷国产综合精品草原| 超碰97人妻| 啊啊啊啊啊好舒服视频| 久久97| 欧美亚洲第一页| 精品无av| 亚洲欧美另类少妇精品| 免费操逼视频下载| 久久老女人| 9999九九九久久久| AV 少妇 人妻 偷拍| 岛国片在线视频网站| 人妻丰满熟妇av无码区蜜桃| 日韩丝袜人妻AV| 免费看A片毛毛片在线播| 美女诱惑久久| 熟女精品一区二区在线观看| 男人的天堂啪啪啪啪啪蜜桃不卡| 欧美人人曰人人操人人射射| 就去色综合| 91视频成人福利网站在线一区| 蜜桃av综合网发布| 日韩三级在线观看网站| 久久精品成人| 60秒试看最爽10分钟网站| 静品嫩模一区二区| 久久精品国内Av熟女高清| 精品国产a∨一区天美传媒| 99操| 狠狠久久亚洲欧美专区| 999亚洲国产视频| 亚洲无992tv| 日韩无码服务区| 日韩啪啪啪视频| 色哟哟的毛片| 亚洲一区二区性爱电影| 日韩精品一区二区高清 | 亚洲精品视频在线播放| 26uuu国产亚洲综合| 夜夜性| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 99re这里只有精品2| 啊啊啊不要啊啊受不了了视频在线| 婷婷五月天成人网| 国产精品成人无码av无码免费| 超碰精品国产无码| 97色综合中文网| 亚洲脚交| 成人精品一区二区三区| 熟妇亚洲一区二区三区| 99视频内射三四| 亚欧国产无码精品在线| 天堂俺去俺来也www久久婷婷| 欧美亚洲天堂| 天美传媒AV在线| 久久久久久人| 97草草| 九九九九免费高| 男人天堂日日夜夜| 久久久99久9| 久久久98网站免费视频| 色婷婷网| 国产精品老师| 国产一区二区av综合| 制度丝袜99| 日韩美女啪啪一区| 少妇熟女1区2区3区| 国产精品熟女一区二区三区| 中文字幕激情小说| 伊人网在线点播| 呻吟 欧美 日本 中出| 极品色电影院| 色拍偷亚洲| 亚洲欧洲无码一区夜| 天天天天天超碰| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日韩一级二级三级免费看完整版国语版| 青青草国产亚洲精品久久 | 熟女久久久| 免费99精品国产自在在线| 亚洲综合图片在线| 亚拍在线| 日韩中文字幕宗合在线| 91爱欧美| 4虎在线视频| 久久精品电影| 加勒比性爱成人在线| 男人天堂网手机版婷婷| 后入式999| 91操熟妇| 亚洲日韩精品一区二区| 天天综合中文字幕 91| 啊啊啊啊啊啊好多水| 无码天堂| 91P0RNY大屁股人妻| 激情五月综合开心五月| 中文字幕一区二区三区字幕| 免费福利视频中文字幕| 久久久久久亚洲中文| 黄色网址在线免费观看| 亚洲操逼无码| 亚洲成人网站在线观看| 99re9在线| 91色噜噜狠狠| 韩国国产欧美情侣视频在线| 操老熟女AV| 久久久亚洲熟妇资源| 国产精品96久久久久久| 日韩操啪| 久久无码成人| 综合欧美日本三级| 五月天婷婷综合| 夜夜操91744565| 99在线视频播放| 中文字幕一品色图| 国产精品乱码久久久| 成·人免费午夜在线观看| 日韩操逼性鲍| 一级啊性爱在线视频| 六月丁香五月婷婷| 国产白嫩精品久久| 色天欧美| 人人操人人摸超碰| 在线观看亚洲成人精品| 熟女精品va中文字幕| 五月天婷婷基地| 亚洲色图欧美色图制服丝袜| 91麻豆一二三区| 久久日韩肥臀| 视频国产成人精品日本亚洲18| 国产51色综合久久免费| 天天爽人人综合免费7799| 97亚洲性爱| 久久美国毛片| 久久东京热久久| 国产女人高潮嗷嗷嗷叫小说 | 加勒比日本在线| 99超碰网| 日韩欧美大片免费高清啪啪| 在线一道啪| 亚洲人妻一区二区三区| 亚洲第一色页夜| 日韩久射综合| 亚洲啪AⅤ永久无码| 在线国产探花| 熟女天天干| 乱人乱色一区二区三区免费| 99re免费视频精品全部| 日本精品成人无码| 夜夜高潮夜夜爽| 久久成人东京热人妻| 婷婷干黄色| 久久丁香| 清清草影| 色悠久| 新版天堂中文资源8在线| 少妇被玩视频二三区| 激情婷婷丁香网| 浓厚中出中文字幕在线| 婷婷99狠狠| 亚洲色图伊人网| 老司机福利青青草| 熟女视频久久| 97亚洲欧美日韩| 99热在线观看| 女人爽到高潮潮喷18禁网站| 曰本熟女视频| 一区二区不卡视| 国产福利精品最新在线| 色欲人妻一区二区在线| 美女久久久久久久久久久| 日韩乱伦影音先锋| 国产SV一线| 亚洲性天堂| 操逼网免费无码视频| 欧美国产一区二区三区麻豆传媒| 97欧美日韩| 97精品综合久久| 劲爆欧美人妖三区91| 国产JDAV无码视频在线观看| 美女人妻色网站| 激情五月婷| 九九免费影片| 日韩在线性爱免费视频| 国产suv精品一区二区四| 91精品久久久久| 日韩不卡毛片Av免费高清| 影音先锋一区二区在线资源| 天天综合91| 国产玖玖| 99re这里只有| 偷窥自拍亚洲天堂网爆| 加勒比综合a∨| 国产精品女生av| 一区 欧美 日韩 麻豆| 一区二区乱码福利| 中文字幕 码 自拍 视频 区| 人妻丰满熟妇av无码区蜜桃| 高清无码 国产精品| 91挑色欧美| 欧美呦呦性爱| 欧美丝袜激情| 国产成人91一区二区三区| 久久久久久久久久久六六| 久久这里只| 26uuu国产| 三级色影综合网|