如果我们从网络端接收的数据是不定长度的,不能提前分配好网络缓存大小,则可以选择使用链式缓存的实现方式。链式缓存主要是分配固定大小的缓存链保存数据,一个管理器去管理这些缓存链。
链式缓存示例:
//一种链式缓冲
//ringbuffer是固定长度,不能够扩展,链式buffer可以任意扩充
/**
* buffer
* *first--chain buffer [1024]
* |--chain buffer
* |--chain buffer
* *datap--|--chain buffer
* *last---chain buffer
* */
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
struct chain_buffer_mgr
{
struct chain_buffer* first;
struct chain_buffer* last;
struct chain_buffer* last_datap; // 指向最后保存数据的缓存链
size_t total_len; // 所有链缓存保存的总共数据
};
struct chain_buffer
{
int read_pos;
int write_pos;
struct chain_buffer* next;
size_t buffer_len;
char* buffer;
};
#define BUFFER_CHAIN_SIZE sizeof(struct chain_buffer)
#define BUFFER_CHAIN_EXTRA (t, c)(t *)((struct chain_buffer *)(c) + 1) //指向chain buffer 缓存区
class ChainBuffer
{
public:
ChainBuffer() {}
~ChainBuffer(){}
void Clear()
{
struct chain_buffer* first = m_oBufferMgr.first;
while (first != nullptr)
{
delete[] first->buffer;
struct chain_buffer* next = first->next;
delete first;
first = next;
}
m_oBufferMgr.first = nullptr;
m_oBufferMgr.last_datap =