Tiny-Web-Server总结

109 阅读3分钟

Buffer类设计

Buffer 类

Buffer 类是一个简单的缓冲区实现,用于管理动态大小的字符缓冲区。主要用于在输入和输出之间缓存数据,以减少系统调用的次数。

构造函数

  • Buffer(int initBuffSize = 1024): 构造函数,可以传入一个初始缓冲区大小,默认为 1024。

公共成员函数

  • WritebleBytes() const: 返回可写字节数。
  • ReadableBytes() const: 返回可读字节数。
  • PrependableBytes() const: 返回可预留字节数。
  • Peek() const: 返回当前读取位置的指针。
  • EnsureWriteable(size_t len): 确保缓冲区可写的长度足够。
  • HasWritten(size_t len): 移动写指针,表示已写入指定长度的数据。
  • Retrive(size_t len): 从缓冲区中读取指定长度的数据。
  • RetriveUntil(const char* end): 读取数据直到指定的结束位置。
  • RetriveAll(): 读取所有数据,并清空缓冲区。
  • RetriveAllToStr(): 读取所有数据并返回为字符串。
  • BeginWriteConst() const: 返回写指针的位置。
  • BeginWrite(): 返回写指针的位置,用于写入数据。
  • Append(const std::string& str): 将字符串追加到缓冲区。
  • Append(const char* str, size_t len): 将指定长度的字符数组追加到缓冲区。
  • Append(const void* data, size_t len): 将二进制数据追加到缓冲区。
  • Append(const Buffer& buff): 将另一个缓冲区的内容追加到当前缓冲区。
  • ReadFd(int fd, int* Errno): 从文件描述符中读取数据到缓冲区。
  • WriteFd(int fd, int* Errno): 将缓冲区的数据写入文件描述符。

私有成员函数

  • BeginPtr_(): 返回缓冲区的起始指针,用于内部访问。
  • MakeSpace_(size_t len): 确保缓冲区可写的长度足够,如果不够则进行扩展。

成员变量

  • std::vector<char> buffer_: 使用 std::vector 存储字符数据的缓冲区。
  • std::atomic<std::size_t> readPos_: 读取位置的原子计数器。
  • std::atomic<std::size_t> writePos_: 写入位置的原子计数器。

头文件

  • #include<cstring>: C 字符串操作函数的头文件。
  • #include<iostream>: 输入输出流相关的头文件。
  • #include<unistd.h>: POSIX 操作系统 API 的头文件。
  • #include<sys/uio.h>: 提供 readv 函数的头文件。
  • #include<vector>: C++ 标准库中的动态数组容器。
  • #include<atomic>: C++ 标准库中的原子操作。
  • #include<assert.h>: 断言相关的头文件。

宏定义

  • #ifndef BUFFER_H: 防止头文件被多次引用。
  • #define BUFFER_H: 定义头文件。

总体来说,这个 Buffer 类提供了一组简单但功能齐全的接口,用于管理缓冲区的读写操作。在多线程环境下,使用原子计数器确保了对读写位置的线程安全访问。

上面是GPT生成的总结,对于该Buffer类实际上,将上面的功能汇总大致可以分为

  1. 制定一个固有大小(1024)的vector
  2. 获取关于当前读下标,写下标以及可读可写的大小,以及操控读写指针进行移动的功能。
  3. 提供make_space即扩容功能,一般在读写超过buffer大小时进行扩容,在read时要求一次性读入,这样是为了减少系统调用,写时没有这个要求。话说这里要插一嘴要分清,readFd和writeFd的功能,read表示将fd中的数据读入buffer中,write是将buffer中的数据写入fd,所以读时才有可能需要扩容操作。