大家好,我是陆砚码。今天我们来聊聊 C++ TCP 服务器框架中的 Buffer 缓冲区实现,这是实现高性能服务器的关键之一。
Buffer 模块的作用是管理通信中的用户态接收和发送缓冲区。我们为什么选择使用 vector
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),获取更多技术分享。
