OpenBuffer用于解析網(wǎng)絡(luò)數(shù)據(jù)流序目,解決TCP粘包問題

OpenBuffer

OpenBuffer 用于讀寫解析二進制流臂痕,解決TCP粘包問題,針對網(wǎng)絡(luò)數(shù)據(jù)流而設(shè)計猿涨。

OpenLinyou開源項目致力于跨平臺服務(wù)器框架握童,在VS或者XCode上寫代碼,無需任何改動就可以編譯運行在Linux上叛赚,甚至是安卓和iOS.
OpenLinyou:https://github.com/openlinyou
https://gitee.com/linyouhappy

跨平臺支持

Windows澡绩、linux、Mac俺附、iOS肥卡、Android等跨平臺設(shè)計

編譯和執(zhí)行

請安裝cmake工具,用cmake可以構(gòu)建出VS或者XCode工程事镣,就可以在vs或者xcode上編譯運行步鉴。
源代碼:https://github.com/openlinyou/openbuffer
https://gitee.com/linyouhappy/openbuffer

git clone https://github.com/openlinyou/openbuffer
cd ./openbuffer
mkdir build
cd build
cmake ..
#如果是win32,在該目錄出現(xiàn)openbuffer.sln璃哟,點擊它就可以啟動vs寫代碼調(diào)試
make
./test

全部源文件

  • src/openbuffer.h
  • src/openbuffer.cpp

技術(shù)特點

OpenBuffer的技術(shù)特點:

  1. 對于添加數(shù)據(jù)push操作氛琢,使用節(jié)點鏈表來管理內(nèi)存。每次push數(shù)據(jù)随闪,數(shù)據(jù)存儲到一個節(jié)點上阳似,超過節(jié)點容量,就會創(chuàng)建新的節(jié)點進行存儲蕴掏。
  2. 從OpenBuffer讀取數(shù)據(jù)障般,先把全部節(jié)點上的數(shù)據(jù)進行合并调鲸,存儲到連續(xù)的內(nèi)存上,然后釋放對應(yīng)節(jié)點的內(nèi)存挽荡。
  3. 支持讀寫固定長度整數(shù)和不固定長度整數(shù)藐石。

1.序列化與反序列化

支持整數(shù),可變長整數(shù)序列化定拟。采用小端編碼于微。

#include <assert.h>
#include <string.h>
#include <string>
#include <vector>
#include "openbuffer.h"

using namespace open;

int main()
{
    OpenBuffer openBuffer(256);

    char data[256] = "Hello OpenBuffer!";
    const std::string str = "Hello OpenLinyou!";
    
    size_t len = strlen(data);
    openBuffer.push(&len, sizeof(len));
    openBuffer.push(data, len);
 
    len = str.size();
    openBuffer.pushUInt32(len);
    openBuffer.push(str.data(), len);

    openBuffer.pushUInt16(1616);
    openBuffer.pushUInt32(3232);
    openBuffer.pushUInt64(6464);

    openBuffer.pushVInt32(0x79);
    openBuffer.pushVInt32(0x80);
    openBuffer.pushVInt32(0x4000);
    openBuffer.pushVInt32(0x10000000);

    openBuffer.pushVInt64(0x10000001);

    std::vector<char> vectData;
    len = 0;
    openBuffer.pop(&len, sizeof(len));
    vectData.resize(len);
    openBuffer.pop(vectData.data(), len);
    assert(memcmp(vectData.data(), data, len) == 0);
    
    char ret[256] = {};
    uint32_t len1 = 0;
    openBuffer.popUInt32(len1);
    openBuffer.pop(ret, len1);
    assert(str == ret);
    
    unsigned short u16 = 0;
    openBuffer.popUInt16(u16);
    assert(u16 == 1616);

    uint32_t u32 = 0;
    openBuffer.popUInt32(u32);
    assert(u32 == 3232);
    uint64_t u64 = 0;
    openBuffer.popUInt64(u64);
    assert(u64 == 6464);


    uint64_t v32 = 0;
    openBuffer.popVInt64(v32);
    assert(v32 == 0x79);

    uint64_t v32_1 = 0;
    openBuffer.popVInt64(v32_1);
    assert(v32_1 == 0x80);

    uint64_t v32_2 = 0;
    openBuffer.popVInt64(v32_2);
    assert(v32_2 == 0x4000);

    uint64_t v32_3 = 0;
    openBuffer.popVInt64(v32_3);
    assert(v32_3 == 0x10000000);

    uint64_t v64 = 0;
    openBuffer.popVInt64(v64);
    assert(v64 == 0x10000001);
    
    return 0;
}

2.解析網(wǎng)絡(luò)數(shù)據(jù)包

模擬socket數(shù)據(jù)包,解析http報文青自。解決HTTP沾包問題株依。

#include <assert.h>
#include <string.h>
#include <string>
#include <vector>
#include "openbuffer.h"

using namespace open;

int main()
{
    std::vector<std::string> datas = {
        "HTTP/1.1 200 OK@&Connection: keep-alive@&Content-Type: application/x-javascript@&",
        "Date: Sat, 18 Mar 2023 08:11:44 GMT@&Strict-Transport-Security: max-age=31536000@&Traceco",
        "de: 24764974122629742602031816@&Vary: Accept-Encoding@&"
    };
    std::string body = "Hello OpenBuffer!!Hello OpenBuffer!!";
    datas.push_back("content-length:" + std::to_string(body.size()) + "@&");
    datas.push_back("@&" + body);
    datas.push_back("@&");
    OpenBuffer openBuffer;
    for (size_t x = 0; x < 10000; x++)
    {
        openBuffer.clear();
        bool isHeader = true;
        size_t k = 0;
        std::string head;
        for (size_t i = 0; i < datas.size(); ++i)
        {
            openBuffer.push(datas[i].data(), datas[i].size());
            if (isHeader)
            {
                unsigned char* tmp = openBuffer.data();
                for (; k < openBuffer.size() - 3; k++)
                {
                    //find @&@&
                    if (tmp[k] == '@' && tmp[k + 1] == '&' && tmp[k + 2] == '@' && tmp[k + 3] == '&')
                        break;
                }
                if (k >= openBuffer.size() - 3) continue;

                k += 4;
                openBuffer.pop(head, k);
                isHeader = false;
            }
        }
        std::string test = body + "@&";
        std::string buffer;
        buffer.append((const char*)openBuffer.data(), openBuffer.size());
        assert(test == buffer);
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市延窜,隨后出現(xiàn)的幾起案子恋腕,更是在濱河造成了極大的恐慌,老刑警劉巖逆瑞,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荠藤,死亡現(xiàn)場離奇詭異,居然都是意外死亡获高,警方通過查閱死者的電腦和手機哈肖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來念秧,“玉大人淤井,你說我怎么就攤上這事践宴〉讼撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵篷帅,是天一觀的道長严就。 經(jīng)常有香客問我总寻,道長,這世上最難降的妖魔是什么梢为? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任渐行,我火速辦了婚禮,結(jié)果婚禮上铸董,老公的妹妹穿的比我還像新娘祟印。我一直安慰自己,他們只是感情好粟害,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布蕴忆。 她就那樣靜靜地躺著,像睡著了一般悲幅。 火紅的嫁衣襯著肌膚如雪套鹅。 梳的紋絲不亂的頭發(fā)上站蝠,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音卓鹿,去河邊找鬼菱魔。 笑死,一個胖子當著我的面吹牛吟孙,可吹牛的內(nèi)容都是我干的澜倦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杰妓,長吁一口氣:“原來是場噩夢啊……” “哼藻治!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巷挥,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤桩卵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后倍宾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吸占,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年凿宾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼蕊。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡初厚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孙技,到底是詐尸還是另有隱情产禾,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布牵啦,位于F島的核電站亚情,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哈雏。R本人自食惡果不足惜楞件,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裳瘪。 院中可真熱鬧土浸,春花似錦、人聲如沸彭羹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽派殷。三九已至还最,卻和暖如春墓阀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拓轻。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工斯撮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悦即。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓吮成,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辜梳。 傳聞我的和親對象是個殘疾皇子粱甫,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容