国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

1.4.C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)并發(fā)服務(wù)器之buffer模塊的設(shè)計(jì)

這篇具有很好參考價(jià)值的文章主要介紹了1.4.C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)并發(fā)服務(wù)器之buffer模塊的設(shè)計(jì)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

項(xiàng)目完整版在:

一、buffer模塊: 緩沖區(qū)模塊

1.4.C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)并發(fā)服務(wù)器之buffer模塊的設(shè)計(jì),CodeCrafters,c++,開(kāi)發(fā)語(yǔ)言,服務(wù)器
Buffer模塊是一個(gè)緩沖區(qū)模塊,用于實(shí)現(xiàn)通信中用戶態(tài)的接收緩沖區(qū)和發(fā)送緩沖區(qū)功能。

二、提供的功能

存儲(chǔ)數(shù)據(jù),取出數(shù)據(jù)

三、實(shí)現(xiàn)思想

1.實(shí)現(xiàn)換出去得有一塊內(nèi)存空間,采用vector ,vector底層是一個(gè)線性的內(nèi)存空間!

(一)要素

1.默認(rèn)空間大小
2.當(dāng)前的讀取數(shù)據(jù)位置!
3.當(dāng)前的寫(xiě)入數(shù)據(jù)位置!

(二)操作

  1. 寫(xiě)入位置
    當(dāng)前寫(xiě)入位置指向哪里,從哪里開(kāi)始寫(xiě)入
    如果后續(xù)剩余空間不夠了!
  2. 考慮整體緩沖區(qū)空閑空間是否足夠?。ㄒ?yàn)樽x位置也會(huì)向后偏移,前后有可能有空閑空間)
    足夠:將數(shù)據(jù)移動(dòng)到起始位置
    不夠:擴(kuò)容,從當(dāng)前寫(xiě)位置開(kāi)始擴(kuò)容足夠大小!
    數(shù)據(jù)一旦寫(xiě)入成功,當(dāng)前寫(xiě)位置,向后偏移!
  3. 讀取數(shù)據(jù)
    當(dāng)前的讀取位置指向哪里,就從哪里開(kāi)始讀取,前提是有數(shù)據(jù)可讀
    可讀數(shù)據(jù)大小:當(dāng)前寫(xiě)入位置,減去當(dāng)前讀取位置!

(三)框架設(shè)計(jì)

class buffer {
    private:
        std::vector<char> _buffer;
        // 位置是一個(gè)相對(duì)偏移量,而不是絕對(duì)地址!
        uint64_t _read_idx; // 讀位置
        uint64_t _write_idx; // 寫(xiě)位置
    public:
        1. 獲取當(dāng)前寫(xiě)的位置
        2. 確??蓪?xiě)空間足夠
        3. 獲取前沿空間大小
        4. 獲取后沿空間大小
        5. 將寫(xiě)入據(jù)位置向后移動(dòng)指定長(zhǎng)度
        6. 獲取當(dāng)前讀取位置的地址!
        7. 獲取可讀空間大小
        8. 將讀位置向后移動(dòng)指定長(zhǎng)度!
        9. clear

四、實(shí)現(xiàn)代碼

#include <ctime>
#include <cstring>
#include <iostream>
#include <vector>
#include <cassert>
#include <string>
using namespace std;
#define BUFFER_SIZE 1024
class Buffer {
    private:
        std::vector<char> _buffer; // 使用vector進(jìn)行內(nèi)存空間管理
        uint64_t _read_idx; // 讀偏移
        uint64_t _write_idx; // 寫(xiě)偏移
    public:
        Buffer():_read_idx(0),_write_idx(0),_buffer(BUFFER_SIZE) {}
        char* begin() {return &*_buffer.begin();}
        // 獲取當(dāng)前寫(xiě)入起始地址
        char *writePosition() { return begin() + _write_idx;}
        // 獲取當(dāng)前讀取起始地址
        char *readPosition() { return begin() + _read_idx; }
        // 獲取緩沖區(qū)末尾空間大小 —— 寫(xiě)偏移之后的空閑空間,總體大小減去寫(xiě)偏移
        uint64_t tailIdleSize() {return _buffer.size() - _write_idx; }
        // 獲取緩沖區(qū)起始空間大小 —— 讀偏移之前的空閑空間
        uint64_t handIdleSize() {return _read_idx ;}
        // 獲取可讀空間大小 = 寫(xiě)偏移 - 讀偏移 
        uint64_t readAbleSize() {return _write_idx - _read_idx ;} 
        // 將讀偏移向后移動(dòng)
        void moveReadOffset(uint64_t len) { 
          // 向后移動(dòng)大小必須小于可讀數(shù)據(jù)大小
              assert(len <= readAbleSize());
              _read_idx += len; 
          }
        // 將寫(xiě)偏移向后移動(dòng)
        void moveWriteOffset(uint64_t len) { 
              assert(len <= tailIdleSize());
              _write_idx += len;
        }
        void ensureWriteSpace(uint64_t len)  {
          // 確??蓪?xiě)空間足夠 (整體空間夠了就移動(dòng)數(shù)據(jù),否則就擴(kuò)容?。? 
            if (tailIdleSize() >= len) return;
            // 不夠的話 ,判斷加上起始位置夠不夠,夠了將數(shù)據(jù)移動(dòng)到起始位置
            if (len <= tailIdleSize() + handIdleSize()) {
                uint64_t rsz = readAbleSize(); //幫當(dāng)前數(shù)據(jù)大小先保存起來(lái)
                std::copy(readPosition(),readPosition() + rsz,begin()); // 把可讀數(shù)據(jù)拷貝到起始位置
                _read_idx = 0; // 讀歸為0
                _write_idx = rsz; // 可讀數(shù)據(jù)大小是寫(xiě)的偏移量!
            }
            else { // 總體空間不夠!需要擴(kuò)容,不移動(dòng)數(shù)據(jù),直接給寫(xiě)偏移之后擴(kuò)容足夠空間即可!
                _buffer.resize(_write_idx + len);

            }
        }
        // 寫(xiě)入數(shù)據(jù)
        void Write(const void *data,uint64_t len) {
        
                ensureWriteSpace(len);
                const char *d = (const char*) data;
                std::copy(d,d + len,writePosition());
        }
        void WriteAndPush(void* data,uint64_t len) {
                Write(data,len);
                moveWriteOffset(len);
        }
         void WriteStringAndPush(const std::string &data) {
            writeString(data);
           
            moveWriteOffset(data.size());
           
        }
        void writeString(const std::string &data) {
                return Write(data.c_str(),data.size());
        }
        void writeBuffer(Buffer &data) {
                return Write(data.readPosition(),data.readAbleSize());
        }
        void writeBufferAndPush(Buffer &data) {
                writeBuffer(data);
                moveWriteOffset(data.readAbleSize());
                
        }
        std::string readAsString (uint64_t len) {
                assert(len <= readAbleSize());
                std::string str;
                str.resize(len);
                Read(&str[0],len);
                return str;
        }
        void Read(void *buf,uint64_t len) {
                // 讀取數(shù)據(jù) 1. 保證足夠的空間 2.拷貝數(shù)據(jù)進(jìn)去
                // 要求獲取的大小必須小于可讀數(shù)據(jù)大??!
                assert(len <= readAbleSize());
                std::copy(readPosition(),readPosition() + len,(char*)buf);
        }
        void readAndPop(void *buf,uint64_t len) {
                Read(buf,len);
                moveReadOffset(len);
        }
        // 逐步調(diào)試?。。。?!
        std::string ReadAsStringAndPop(uint64_t len) {
            assert(len <= readAbleSize());
            std::string str = readAsString(len);
            moveReadOffset(len);
            return str;
        }
        char* FindCRLF() {
                char *res = (char*)memchr(readPosition(),'\n',readAbleSize());
                return res;
        }
        // 通常獲取一行數(shù)據(jù),這種情況針對(duì)是:
        std::string getLine() {
                char* pos = FindCRLF();
                if (pos == NULL) {
                    return "";
                }
                // +1 為了把換行數(shù)據(jù)取出來(lái)!
                return readAsString(pos - readPosition() + 1);
        }
        std::string getLineAndPop() {
                std::string str = getLine();
                moveReadOffset(str.size());
                return str;
        }
        void Clear() { // 清空緩沖區(qū)!clear
                // 只需要將偏移量歸0即可!
                _read_idx = 0;
                _write_idx = 0;
        }
};

五、進(jìn)行測(cè)試

#include "server.hpp"
using namespace std;
// 控制打印信息?。?!
#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL INF
    #define LOG(level,format,...) do{\
    if (level < LOG_LEVEL) break;\
    time_t t = time(NULL);\
    struct tm *ltm = localtime(&t);\
    char tmp[23] = {0};\
    strftime(tmp,31,"%H:%M:%S",ltm);\
    fprintf(stdout,"[%s,%s:%d] " format "\n",tmp,__FILE__,__LINE__,##__VA_ARGS__);\
}while(0)

#define INF_LOG(format, ...) LOG(INF, format, ##__VA_ARGS__)
#define DBG_LOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ERR_LOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)

int main() {
    Buffer buf;
    std::string str = "hello!";
    // buf.WriteStringAndPush(str);
    // Buffer buf1;
    // buf1.writeBufferAndPush(buf);
    // std::string tmp;
    // tmp = buf1.ReadAsStringAndPop(buf.readAbleSize());
    // cout << tmp << endl;
    // cout << buf.readAbleSize() << endl;
    // cout << buf1.readAbleSize() << endl;
    for (int i = 0; i < 300; i ++) {
        std::string str = "hello" + std::to_string(i) + '\n';
        buf.WriteStringAndPush(str);
    }
    while(buf.readAbleSize() > 0) {
        string line = buf.getLineAndPop();
        LOG("hello");  
    }
    // string tmp;
    // tmp = buf.ReadAsStringAndPop(buf.readAbleSize());
    // cout << tmp << endl;
    
    return 0;
}

中秋快樂(lè)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729418.html

到了這里,關(guān)于1.4.C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)并發(fā)服務(wù)器之buffer模塊的設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 1.16.C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)并發(fā)服務(wù)器之HttpContext以及HttpServer模塊的設(shè)計(jì)

    1.16.C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)并發(fā)服務(wù)器之HttpContext以及HttpServer模塊的設(shè)計(jì)

    添加請(qǐng)求—— 處理函數(shù)映射信息(GET/POST/PUT/DELETE) 設(shè)置靜態(tài)資源根目錄 設(shè)置是否啟動(dòng)超時(shí)連接關(guān)閉 設(shè)置線程池中線程數(shù)量 啟動(dòng)服務(wù)器 OnConnected - 用于給TcpServer設(shè)置協(xié)議上下文 OnMessage - 用于進(jìn)行緩沖區(qū)數(shù)據(jù)解析處理 獲取上下文,進(jìn)行緩沖區(qū)數(shù)據(jù)對(duì)象 請(qǐng)求的路由查 找 靜態(tài)資

    2024年02月07日
    瀏覽(36)
  • 【項(xiàng)目設(shè)計(jì)】仿 muduo 庫(kù)實(shí)現(xiàn) OneThreadOneEventLoop 式并發(fā)服務(wù)器

    【項(xiàng)目設(shè)計(jì)】仿 muduo 庫(kù)實(shí)現(xiàn) OneThreadOneEventLoop 式并發(fā)服務(wù)器

    本項(xiàng)目主要是模仿 muduo 庫(kù)實(shí)現(xiàn)一個(gè)以主從 Reactor 為模型,以 OneThreadOneEventLoop 為事件驅(qū)動(dòng)的高并發(fā)服務(wù)器組件。通過(guò)這個(gè)服務(wù)器組件,我們可以簡(jiǎn)潔快速的搭建出一個(gè)高性能的 TCP 服務(wù)器。并且組件內(nèi)部會(huì)提供不同的應(yīng)用層協(xié)議支持,組件使用者可以通過(guò)這些協(xié)議快速的完成

    2024年04月23日
    瀏覽(39)
  • 一、C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)高性能高并發(fā)服務(wù)器

    一、C++項(xiàng)目:仿muduo庫(kù)實(shí)現(xiàn)高性能高并發(fā)服務(wù)器

    仿mudou庫(kù)one thread oneloop式并發(fā)服務(wù)器實(shí)現(xiàn) 仿muduo庫(kù)One Thread One Loop式主從Reactor模型實(shí)現(xiàn)高并發(fā)服務(wù)器: 通過(guò)實(shí)現(xiàn)的高并發(fā)服務(wù)器組件,可以簡(jiǎn)潔快速的完成一個(gè)高性能的服務(wù)器搭建。并且,通過(guò)組件內(nèi)提供的不同應(yīng)用層協(xié)議支持,也可以快速完成一個(gè)高性能應(yīng)用服務(wù)器的搭建

    2024年02月07日
    瀏覽(34)
  • 仿muduo庫(kù)實(shí)現(xiàn)one thread one loop式并發(fā)服務(wù)器

    仿muduo庫(kù)實(shí)現(xiàn)one thread one loop式并發(fā)服務(wù)器

    ? 文章目錄 一、項(xiàng)目簡(jiǎn)介 二、項(xiàng)目整體認(rèn)識(shí) 2、1?HTTP服務(wù)器 2、2 Reactor模型 三、預(yù)備知識(shí) 3、1 C++11 中的 bind 3、2?簡(jiǎn)單的秒級(jí)定時(shí)任務(wù)實(shí)現(xiàn) 3、3?正則庫(kù)的簡(jiǎn)單使用 3、4?通用類型any類型的實(shí)現(xiàn) 四、服務(wù)器功能模塊劃分與實(shí)現(xiàn) 4、1 Buffer模塊 4、2 Socket模塊 4、3 Channel模塊 4、

    2024年04月09日
    瀏覽(23)
  • 基于muduo網(wǎng)絡(luò)庫(kù)實(shí)現(xiàn)的集群聊天服務(wù)器

    基于muduo網(wǎng)絡(luò)庫(kù)實(shí)現(xiàn)的集群聊天服務(wù)器

    ?。?!項(xiàng)目是照著騰訊課堂施磊老師的視頻學(xué)習(xí),僅供個(gè)人學(xué)習(xí)記錄使用?。?! ?。。№?xiàng)目是照著騰訊課堂施磊老師的視頻學(xué)習(xí),僅供個(gè)人學(xué)習(xí)記錄使用!??! !?。№?xiàng)目是照著騰訊課堂施磊老師的視頻學(xué)習(xí),僅供個(gè)人學(xué)習(xí)記錄使用?。。?使用muduo網(wǎng)絡(luò)庫(kù)搭建網(wǎng)絡(luò)核心模塊

    2024年04月26日
    瀏覽(20)
  • 【實(shí)戰(zhàn)項(xiàng)目】c++實(shí)現(xiàn)基于reactor的高并發(fā)服務(wù)器

    【實(shí)戰(zhàn)項(xiàng)目】c++實(shí)現(xiàn)基于reactor的高并發(fā)服務(wù)器

    基于Reactor的高并發(fā)服務(wù)器,分為反應(yīng)堆模型,多線程,I/O模型,服務(wù)器,Http請(qǐng)求和響應(yīng)五部分 ?全局 Channel 描述了文件描述符以及讀寫(xiě)事件,以及對(duì)應(yīng)的讀寫(xiě)銷毀回調(diào)函數(shù),對(duì)應(yīng)存儲(chǔ)arg讀寫(xiě)回調(diào)對(duì)應(yīng)的參數(shù) ?Channel 異或 |:相同為0,異為1 按位與:只有11為1,其它組合全部

    2024年02月12日
    瀏覽(32)
  • 基于多反應(yīng)堆的高并發(fā)服務(wù)器【C/C++/Reactor】(中)Channel 模塊的實(shí)現(xiàn)

    基于多反應(yīng)堆的高并發(fā)服務(wù)器【C/C++/Reactor】(中)Channel 模塊的實(shí)現(xiàn)

    在這篇文章中雖然實(shí)現(xiàn)了能夠和多客戶端建立連接,并且同時(shí)和多個(gè)客戶端進(jìn)行通信。 基于多反應(yīng)堆的高并發(fā)服務(wù)器【C/C++/Reactor】(上)-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/135141316?spm=1001.2014.3001.5501 但是有一個(gè) 問(wèn)題(O_O)? : 這個(gè)程序它是單線程的。如果我們想

    2024年02月03日
    瀏覽(94)
  • C++項(xiàng)目——集群聊天服務(wù)器項(xiàng)目(一)項(xiàng)目介紹、環(huán)境搭建、Boost庫(kù)安裝、Muduo庫(kù)安裝、Linux與vscode配置

    C++項(xiàng)目——集群聊天服務(wù)器項(xiàng)目(一)項(xiàng)目介紹、環(huán)境搭建、Boost庫(kù)安裝、Muduo庫(kù)安裝、Linux與vscode配置

    今天開(kāi)始想更新一個(gè)C++項(xiàng)目,實(shí)現(xiàn)一個(gè) 支持跨服務(wù)器通信、支持負(fù)載均衡的集群聊天服務(wù)器項(xiàng)目 。項(xiàng)目會(huì)應(yīng)用muduo網(wǎng)絡(luò)庫(kù)、CMake編譯、MySQL數(shù)據(jù)庫(kù)、JSon序列化與反序列化、Redis消息訂閱模式以及Nginx負(fù)載均衡功能。 有興趣的寶可以跟我一起實(shí)操起來(lái),鞏固自己的C++學(xué)習(xí)吧~ 本項(xiàng)

    2024年04月14日
    瀏覽(91)
  • 模擬實(shí)現(xiàn)消息隊(duì)列項(xiàng)目(系列4) -- 服務(wù)器模塊(內(nèi)存管理)

    模擬實(shí)現(xiàn)消息隊(duì)列項(xiàng)目(系列4) -- 服務(wù)器模塊(內(nèi)存管理)

    目錄 前言 1.?創(chuàng)建MemoryDataCenter 2. 封裝Exchange 和 Queue方法 3. 封裝Binding操作 4. 封裝Message操作 4.1 封裝消息中心集合messageMap 4.2 封裝消息與隊(duì)列的關(guān)系集合queueMessageMap的操作 5. 封裝未確認(rèn)消息集合waitMessage的操作 6. 從硬盤(pán)中恢復(fù)數(shù)據(jù)到內(nèi)存中 7. MemoryDataCenter單元測(cè)試 結(jié)語(yǔ) ? ?

    2024年02月14日
    瀏覽(28)
  • C++項(xiàng)目:仿mudou庫(kù)one thread one loop式并發(fā)服務(wù)器實(shí)現(xiàn)

    C++項(xiàng)目:仿mudou庫(kù)one thread one loop式并發(fā)服務(wù)器實(shí)現(xiàn)

    目錄 1.實(shí)現(xiàn)目標(biāo) 2.HTTP服務(wù)器 3.Reactor模型 3.1分類 4.功能模塊劃分: 4.1SERVER模塊: 4.2HTTP協(xié)議模塊: 5.簡(jiǎn)單的秒級(jí)定時(shí)任務(wù)實(shí)現(xiàn) 5.1Linux提供給我們的定時(shí)器 5.2時(shí)間輪思想: 6.正則庫(kù)的簡(jiǎn)單使用 7.通用類型any類型的實(shí)現(xiàn) 8.日志宏的實(shí)現(xiàn) 9.緩沖區(qū)buffer類的實(shí)現(xiàn) 10.套接字Socket類實(shí)現(xiàn) 11.

    2024年02月08日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包