首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言實現輸入輸出流:網絡編程基礎組件設計

     編輯:關於C語言

設計目標

實現類似 Java InputStream/OutputStream 的二進制數據流讀寫組件,支援基本類型(byte, int16, int32, float, double)、字串、原始數據塊的序列化與反序列化,適用於網絡協議封包/解包。

核心數據結構

輸出流結構

struct fs_output_stream {
    BYTE byte_order;      // 字節序:大端/小端
    BYTE *data;           // 動態緩衝區
    size_t pos;           // 當前寫入位置
    size_t buff_len;      // 緩衝區總容量
    fs_script_id script_id; // 腳本標識(擴展用)
};

輸入流結構

struct fs_input_stream {
    BYTE byte_order;
    BYTE *data;
    size_t pos;           // 當前讀取位置
    size_t len;           // 數據總長度
    fs_bool copy;         // 是否擁有數據所有權
    fs_script_id script_id;
};

關鍵功能實現

動態擴容寫入

void fs_stream_write_data(struct fs_output_stream* stream, BYTE* data, size_t len) {
    // 空間不足時雙倍擴容
    while (stream->pos + len > stream->buff_len) {
        void* new_data = fs_realloc(stream->data, stream->buff_len << 1);
        stream->data = (BYTE*)new_data;
        stream->buff_len <<= 1;
    }
    memcpy(stream->data + stream->pos, data, len);
    stream->pos += len;
}

所有具體類型寫入(write_uint32 等)均調用此基礎函數,通過 memcpy 實現類型無關的字節拷貝。

字節序處理

結構體保存 byte_order 字段,讀寫時可根據需要進行字節序轉換(代碼中宏 _stream_read 直接 memcpy,假設主機序與網絡序一致,實際項目需加入 htonl/ntohl 轉換)。

輸入流雙模式

  • fs_create_input_stream:零拷貝模式,直接引用外部緩衝區,copy=false,釋放時不釋放數據。
  • fs_create_input_stream_with_copy:深拷貝模式,內部分配記憶體複製數據,copy=true,釋放時連同數據一起釋放。

字串讀寫擴展

代碼中 fs_stream_read_string 返回 0 為佔位,實際實現需協議約定:

  • 定長字串:直接讀取固定字節數
  • 長度前綴:先讀長度(uint16/uint32),再讀內容
  • 以 \0 結尾:逐字節讀取直到遇到 0

記憶體管理規範

  • 使用自定義 fs_malloc/fs_free/fs_realloc 統一內存管理,便於替換內存池、檢測洩漏。
  • fs_zero 宏確保結構體初始化為 0,避免未初始化字段導致未定義行為。
  • 輸出流銷毀時釋放緩衝區與結構體本身;輸入流根據 copy 標誌決定是否釋放數據緩衝區。

應用場景

  1. 網絡封包構建:協議頭 + 承載數據 → fs_output_stream 序列化 → 發送
  2. 協議解析:接收數據 → fs_input_stream 反序列化 → 業務邏輯處理
  3. 本地存儲:配置結構體 → 序列化寫入檔案 → 讀取反序列化還原

代碼亮點總結

  • 介面設計清晰,職責單一,易於單元測試
  • 動態擴容策略平衡效能與記憶體
  • 支援零拷貝與深拷貝兩種模式,靈活適應不同場景
  • 字節序字段預留跨平台擴展能力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved