1. 程式人生 > >最簡單的TCP網路封包解包(補充)-序列化

最簡單的TCP網路封包解包(補充)-序列化

{
public:
    
conststatic size_t DEFAULT_SIZE =0x1000;

    ByteBuffer()
        : mReadPos(
0)
        , mWritePos(
0)
    
{
        mStorage.reserve(DEFAULT_SIZE);
    }


    ByteBuffer(size_t res)
        : mReadPos(
0)
        , mWritePos(
0)
    
{
        mStorage.reserve(res);
    }


    ByteBuffer(
const ByteBuffer &buf) 
        : mReadPos(buf.mReadPos)
        , mWritePos(buf.mWritePos)
        , mStorage(buf.mStorage)
    
{}

    
//////////////////////////////////////////////////////////////////////////
public:
    
void clear()
    
{
        mStorage.clear();
        mReadPos 
= mWritePos =0;
    }


    template 
<typename T>
        
void append(T value)
    
{
        append((uint8
*)&value, sizeof
(value));
    }


    template 
<typename T>
        
void put(size_t pos, T value)
    
{
        put(pos, (uint8
*)&value, sizeof(value));
    }


    
//////////////////////////////////////////////////////////////////////////
public:
    ByteBuffer
&operator<<(bool value)
    
{
        append
<char>((char)value);
        
return*this;
    }

    ByteBuffer
&operator
<<(uint8 value)
    
{
        append
<uint8>(value);
        
return*this;
    }

    ByteBuffer
&operator<<(uint16 value)
    
{
        append
<uint16>(value);
        
return*this;
    }

    ByteBuffer
&operator<<(uint32 value)
    
{
        append
<uint32>(value);
        
return*this;
    }

    ByteBuffer
&operator<<(uint64 value)
    
{
        append
<uint64>(value);
        
return*this;
    }


    ByteBuffer
&operator<<(int8 value)
    
{
        append
<int8>(value);
        
return*this;
    }

    ByteBuffer
&operator<<(int16 value)
    
{
        append
<int16>(value);
        
return*this;
    }

    ByteBuffer
&operator<<(int32 value)
    
{
        append
<int32>(value);
        
return*this;
    }

    ByteBuffer
&operator<<(int64 value)
    
{
        append
<int64>(value);
        
return*this;
    }


    ByteBuffer
&operator<<(float value)
    
{
        append
<float>(value);
        
return*this;
    }

    ByteBuffer
&operator<<(double value)
    
{
        append
<double>(value);
        
return*this;
    }

    ByteBuffer
&operator<<(time_t value)
    
{
        append
<time_t>(value);
        
return*this;
    }


    ByteBuffer
&operator<<(const std::string& value)
    
{
        append((uint8 
const*)value.c_str(), value.length());
        append((uint8)
0);
        
return*this;
    }

    ByteBuffer
&operator<<(constchar* str)
    
{
        append( (uint8 
const*)str, str ? strlen(str) : 0);
        append((uint8)
0);
        
return*this;
    }


    
//////////////////////////////////////////////////////////////////////////
public:
    ByteBuffer
&operator>>(bool& value)
    
{
        value 
= read<char>() >0?true : false;
        
return*this;
    }

    ByteBuffer
&operator>>(uint8& value)
    
{
        value 
= read<uint8>();
        
return*this;
    }

    ByteBuffer
&operator>>(uint16& value)
    
{
        value 
= read<uint16>();
        
return*this;
    }

    ByteBuffer
&operator>>(uint32& value)

相關推薦

簡單TCP網路(補充)-序列

{public:    conststatic size_t DEFAULT_SIZE =0x1000;    ByteBuffer()        : mReadPos(0)        , mWritePos(0)    {        mStorage.reserve(DEFAULT_SIZE);

資料協議之TCP

資料封包協議規定:整個資料包包含2位元組長度資訊+資料包體。2位元組長度資訊包含本身著2位元組。如:資料體是(abcdefg)7個位元組,整體封包就是09abcdefg,總共是9個位元組的協議 1、netbus接收到資料後傳送到static void on_recv_tcp_data(uv_

javascript中this詳(史上簡單易理解的講解,你不再找錯this指向)

判斷方法 this永遠指向一個物件,但普通函式與箭頭函式this指向不同。 普通函式: 普通函式的this是動態的,由函式是如何被呼叫的來決定。 ①是否使用了new以建構函式方式來呼叫函式,如果是則指向新建立的物件 ②是否使用(物件.屬性)的方式呼叫函式(如Obj.

WebSocket資料

websocket和TCP/IP多了一個握手協議(ws協議不用2位元組長度加資料體的協議) 1、ws_protocol類 class ws_protocol{ public: static bool ws_shake_hand(session* s, char* body, int l

網路傳輸粘處理

有時候傳送的資料過長,接收的時候只接收了一部分,會出現錯誤。這裡以客戶端接收服務端訊息為例,講解一種解包的方法,作為備忘(總是忘沒辦法) 1.客戶端有一段緩衝區char m_szAnalysisBuf[51200] 成員變數,用於存放接收資料,在回撥函式收到資料後,判斷緩衝

簡單總結AssetBundle的打包/

最近參考了各位大神的資源,初步學習了Unity的資源管理模式,包括在編輯器管理(使用AssetDatabase)和在執行時管理(使用Resources和AssetBundle)。在此簡單總結執行時用AssetBundle動態打包/解包資源的方法,方便自己回顧。

史上簡單教程:向第三方jar注入自己的程式碼

注意:全文極短,適用於各種反編譯小白,程式小白,讀完僅需2分鐘! 我們經常使用第三方庫,但當我們遇到一些個性化需求,第三方庫沒有預留介面的時候,怎麼辦? 比如我們專案中用到友盟的社會化分享元件,但是友盟的分享對話方塊實在是醜!而他們又沒有留下足夠的介面支援我

python-基礎筆記5-使用

1. 建立包結構 # subl . #sublime開啟資料夾 # tree #包 的內部結構 . ├── setup.py #包啟動檔案 ├── suba │ ├

socket通訊 tcp/ip協議的拆

byte []surplusPack; private void getCount() { // 監聽訊息 new Thread(new Runnable() { @Override public void run() { w

VC小工具.簡單TCP服務器

error 接收數據 target ise style net socket span ++ 1、C++基於TCP_IP簡單的客戶端、服務器通信程序實例 - happy_xiahuixiax的博客 - CSDN博客.html(https://blog.csdn.net/ha

VC小工具.簡單TCP伺服器

1、C++基於TCP_IP簡單的客戶端、伺服器通訊程式例項 - happy_xiahuixiax的部落格 - CSDN部落格.html(https://blog.csdn.net/happy_xiahuixiax/article/details/72627426) 2、 3、程式碼:(VC6 編譯通過,未

簡單TCP網路程式設計

通訊過程 伺服器端: 1、 建立 ServerSocket 物件(並繫結埠) 2、 呼叫 accept 方法,等待來自客戶端的連線 3、 呼叫 getXXXStream 方法,進行 I/O 4、 關閉 Socket 客戶端: 1、 建立 Socket 物件,並連

Netty學習-02(粘 FrameDecoder)

1、簡介 Java1.4提供了NIO使開發者可以使用Java編寫高效能的服務端程式,但使用原生的NIO API就像Linux C中網路程式設計一樣,還是需要做IO處理、協議處理等低層次工作。所以,就像C服務端程式大量使用libevent作為網路應用框架一樣,Java社群也不斷

oc kvc的模式:匹配搜索模式(模式匹配)、裝

it works optional 模式 frame document val index stand ember 按照一定規則使用匹配模式在目標空間進行搜索,然後執行相應操作; 運行時系統將kvc的運行機制解釋為模式匹配,將值的兼容性問題解釋為裝包解包問題

Java IO詳(六)------序列與反序列(物件流)

1、什麼是序列化與反序列化? 序列化:指把堆記憶體中的 Java 物件資料,通過某種方式把物件儲存到磁碟檔案中或者傳遞給其他網路節點(在網路上傳輸)。這個過程稱為序列化。通俗來說就是將資料結構或物件轉換成二進位制串的過程   反序列化:把磁碟檔案中

java io詳六:序列與反序列(物件流)

1、什麼是序列化與反序列化?   序列化:指把堆記憶體中的 Java 物件資料,通過某種方式把物件儲存到磁碟檔案中或者傳遞給其他網路節點(在網路上傳輸)。這個過程稱為序列化。通俗來說就是將資料結構或物件轉換成二進位制串的過程   反序列化:把磁碟檔案中的物件資料或者把網路節點上的物件資料,恢

基於Netty的RPC簡單框架實現(三):Kryo實現序列

1.序列化和反序列化 網路中都是以位元組序列的形式來傳輸資料的,因此在傳送訊息時需要先將物件序列化轉換為位元組序列,然後將獲得的位元組序列傳送出去,訊息接收方接收到位元組序列後將之反序列化獲得傳輸的物件,從收發雙方來看就如同直接傳送和接收了物件一樣。 2.第三方依賴 本例

JSON資料處理框架Jackson精第一篇-序列與反序列核心用法

![](https://img2020.cnblogs.com/other/1815316/202009/1815316-20200917075812877-1999033792.png) Jackson是Spring Boot預設的JSON資料處理框架,但是其並不依賴於任何的Spring 庫。有的小夥伴以為

一個簡單的SOCKET程序的數據結構和函數

... 服務 windows print class 學生 define bsp include /*練習寫套接字通信程序時候寫的一段代碼,本來想寫個聊天室但寫來寫去進度卡在界面上接節下來都是通信部分的代碼 因為只是試驗用所以都是用C寫的,等界面部分完工後會用類來封裝一下

Unity C# 自定義TCP傳輸協議以及、解決粘問題(網路應用層協議)

本文只是初步實現了一個簡單的基於TCP的自定協議,更為複雜的協議可以根據這種方式去擴充套件。 網路應用層協議,通俗一點的講,它是一種基於socket傳輸的由傳送方和接收方事先協商好的一種訊息包組成結構,主要由訊息頭和訊息體組成。  眾所周知,基於socket的資訊互動有兩