跳转到主内容
思享编程网:思考分享,玩转编程世界!

C++ TCP 服务器框架中的 Buffer 缓冲区,到底怎么实现?

大家好,我是陆砚码。今天我们来聊聊 C++ TCP 服务器框架中的 Buffer 缓冲区实现,这是实现高性能服务器的关键之一。

Buffer 模块的作用是管理通信中的用户态接收和发送缓冲区。我们为什么选择使用 vector 而不是 STL 自带的 string 呢?主要是因为 string 会自带 \0 结尾,不适合存储二进制文件,而且它的可扩展性较差,每次插入和删除都会从头开始遍历,效率很低。

Buffer 的要素

  • 一个默认空间大小的 vector
  • 当前读取数据位置的下标
  • 当前写入数据位置的下标

Buffer 的相关操作

下面是 Buffer 的各种操作,我会用代码和文字结合的方式解释。

构造与析构

构造函数:初始化缓冲区,默认大小为 DEFAULT_BUFFER_SIZE,读写索引归零。

析构函数:调用 Clear() 清理。

空间查询

HeadSize():获取读位置之前的空闲空间大小。

TailSize():获取写位置之后的空闲空间大小。

ReadAbleSize():获取当前可读数据的大小。

指针获取

WritePosition():获取当前写位置的指针。

ReadPosition():获取当前读位置的指针。

偏移移动

MoveWriteOffset(uint64_t len):将写位置向后移动 len 字节。

MoveReadOffset(uint64_t len):将读位置向后移动 len 字节。

写入操作

Write(const void* data, uint64_t len):写入数据(不自动移动写偏移)。

WriteAndPush(const void* data, uint64_t len):写入数据并移动写偏移。

WriteAsString(const std::string& data):写入字符串。

WriteStringAndPush(const std::string& data):写入字符串并移动写偏移。

WriteBuffer(Buffer& data):写入另一个 Buffer 的可读数据。

WriteBufferAndPush(Buffer& data):写入另一个 Buffer 并移动写偏移。

读取操作

Read(const void* buf, uint64_t len):读取数据到外部缓冲区。

ReadAndPop(void* buf, uint64_t len):读取数据并移动读偏移。

ReadAsString(uint64_t len):读取指定长度数据并返回 std::string。

ReadAsStringAndPop(uint64_t len):读取指定长度数据并移动读偏移。

行操作

FindCRLF():在可读数据中查找第一个 字符。

GetLine():获取一行数据。

GetLineAndPop():获取一行数据并移动读偏移。

清理与重置

Clear():重置读、写索引为 0。

Init():私有函数,预留默认大小并重置索引。

内部辅助操作

Begin():获取底层 vector 的起始指针。

Empty():判断缓冲区是否为空。

EnableWriteSpace(uint64_t len):确保有 len 字节的可写空间。

接下来是 Buffer 的代码实现,这里就不详细展开了。

// Buffer 的代码实现

最后是测试代码,这里也简化了。

// 测试代码

希望通过这篇文章,大家能对 Buffer 缓冲区的实现有一个更深入的理解。如果还有其他问题,欢迎在评论区留言讨论。

我是陆砚码,关注「思享编程网」(www.sxgpb.com),获取更多技术分享。

相关文章