如果我們從網路端接收的資料是不定長度的,不能提前分配好網路快取大小,則可以選擇使用鏈式快取的實現方式。鏈式快取主要是分配固定大小的快取鏈儲存資料,乙個管理器去管理這些快取鏈。
鏈式快取示例:
//一種鏈式緩衝
//ringbuffer是固定長度,不能夠擴充套件,鏈式buffer可以任意擴充
/** * buffer
* *first--chain buffer [1024]
* |--chain buffer
* |--chain buffer
* *datap--|--chain buffer
* *last---chain buffer
* */
#include #include #include using namespace std;
struct chain_buffer_mgr
;struct chain_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
~chainbuffer(){}
void clear()
m_obuffermgr.first = nullptr;
m_obuffermgr.last_datap = nullptr;
m_obuffermgr.last = nullptr;
} void init(int bufsize)
void init(int chains, int bufsize)
else
}} void write(const char* buf, int size)
else
int write_len = 0;
int can_write_len = 0;
while (chain && size > 0)
if (chain->write_pos == 0 && size >= m_nbufsize)
else
memcpy(chain->buffer + chain->write_pos, buf + write_len, can_write_len);
size -= can_write_len;
chain->write_pos += can_write_len;
write_len += can_write_len;
m_obuffermgr.last_datap = chain;
if (chain->next == nullptr)
else
} }void read(char* buf, int size)
memcpy(buf + read_len, chain->buffer + chain->read_pos, can_read_len);
m_obuffermgr.total_len -= can_read_len;
read_len += can_read_len;
size -= can_read_len;
chain->read_pos += can_read_len;
if (chain->read_pos == chain->buffer_len)
}} int totaldatasize()
chain_buffer_mgr& getbuffermgr()
private:
size_t m_nbufsize;
chain_buffer_mgr m_obuffermgr;
};int main()
cout << endl;
char buf[22];
memset(buf, 0, sizeof(buf));
chainbuffer.read(buf, 21);
cout << buf << endl;
cout << endl;
chain = chainbuffer.getbuffermgr().first;
while (chain)
chainbuffer.clear();
}
上面是固定長度的鏈式快取,不能很好的應用與socket 接收,如果直接使用read、write 讀寫快取,可以參考下面提供的實現
使用方式:
(eventread、eventwrite 兩個函式)
c 實現迴圈快取buffer
迴圈buffer是一種高效快取方式,一般用於接收固定長度協議使用。如果使用不斷擴充套件的快取操作 見 則我們必須要malloc不斷擴張快取,還會memcpy或memmve操作,效率比較低,而ringbuffer則很好的規避這些低效操作。如果協議長度是固定的,則可以使用ringbuffer作為網路的接...
c 常用buffer實現
1 乙個buffer快取簡單實現 include include include include class buffer m cap m incr m begin m end 0 buffer int getbegin int getend int getcap int getleft int c...
C 實現的Buffer類
寫c 的同志一定覺得byte 比c 的 byte 加 length的方式好的多。一來,只需要乙個物件就可以是表示一段位元組流,另一方面,由於c 的特性,不需要象c 那樣還要記得刪除指標。由於我工作中,需要頻繁地試用c 和c 所以寫了個c 的類,以便方便地管理位元組流。很簡單,先定義乙個類 cmemo...