1. peek()
功能:该方法允许你查看缓冲区的数据,但不会改变读取指针。它返回指向当前缓冲区位置的指针,可以在不修改指针的情况下读取数据。
使用示例:
const char* data = buf->peek(); // 获取缓冲区当前读指针位置的数据
// 可以对数据进行处理,但读取指针位置不变
名称解释:peek
意味着“偷看”或“窥视”,即你可以查看缓冲区中的数据,但不会消耗它。这个方法常用于读取但不修改缓冲区内容。
2. retrieveUntil(const char end)*
功能:从缓冲区中提取数据,直到 end
指定的位置为止。调用此方法后,缓冲区的读取指针会移动到 end
指向的位置。
使用示例:
buf->retrieveUntil(crlf + 2); // 提取数据直到 CRLF 位置
名称解释:retrieveUntil
表示“检索直到...”,它会提取缓冲区中指定位置前的数据。这常用于处理数据并清理缓冲区,直到特定的标记(例如换行符)为止。
3. retrieve(size_t len)
功能:从缓冲区中读取指定字节数的数据,并移动读取指针。
使用示例:
buf->retrieve(10); // 读取 10 个字节
名称解释:retrieve
意味着“取回”或“提取”,通常用于从缓冲区中提取指定长度的数据。调用此方法后,缓冲区的读取指针会向前移动。
4. readableBytes()
功能:返回缓冲区当前可以读取的字节数,即从当前读取位置到缓冲区末尾的字节数。
使用示例:
size_t len = buf->readableBytes(); // 获取当前可读取的字节数
名称解释:readableBytes
表示“可读取的字节数”。这个方法用于检查当前缓冲区中的可用数据量,常用于判断是否有足够的字节可供读取。
5. retrieveAll()
功能:清空缓冲区的所有数据,并将读取指针移动到缓冲区的开头。
使用示例:
buf->retrieveAll(); // 清空缓冲区数据
名称解释:retrieveAll
表示“取回所有”,即从缓冲区中提取并清除所有数据。此方法在处理完当前的数据后常常用于重置缓冲区。
6. findCRLF()
功能:查找缓冲区中第一个出现的 CRLF(\r\n
)的位置。该方法常用于解析 HTTP 请求的行。
使用示例:
const char* crlf = buf->findCRLF(); // 查找缓冲区中的 CRLF
if (crlf) {
// 找到 CRLF,可以处理这一行的数据
}
名称解释:findCRLF
表示“查找 CRLF”,常用于 HTTP 请求头的解析,因为 HTTP 使用 CRLF 作为行结束符。
7. append(const void data, size_t len)*
功能:向缓冲区追加数据。
使用示例:
buf->append(data, len); // 向缓冲区添加数据
名称解释:append
表示“附加”或“追加”,表示将更多的数据加到缓冲区的末尾。
8. hasWritten(size_t len)
功能:更新缓冲区的写指针,表示已经写入指定长度的数据。
使用示例:
buf->hasWritten(10); // 标记已经写入了 10 个字节的数据
名称解释:hasWritten
表示“已经写入”,用于指示缓冲区中的写指针已向前推进了指定长度的数据。
9. peekUInt32()
功能:从缓冲区当前位置读取一个 32 位无符号整数,但不改变读取指针。
使用示例:
uint32_t value = buf->peekUInt32(); // 获取一个 32 位无符号整数
名称解释:peekUInt32
表示“窥视一个无符号 32 位整数”。这个方法常用于在不改变缓冲区读取位置的情况下查看整数值。
10. readInt32()
功能:从缓冲区读取一个 32 位整数,并移动读取指针。
使用示例:
int32_t value = buf->readInt32(); // 获取一个 32 位整数
名称解释:readInt32
表示“读取一个 32 位整数”,该方法会读取缓冲区中的整数并更新指针位置。
总结:
muduo::net::Buffer
类提供了一些非常实用的接口来管理和操作缓冲区的数据。常见的接口如 peek()
和 retrieve()
提供了对缓冲区中数据的查看和提取功能;而 findCRLF()
、append()
、hasWritten()
等方法则帮助我们更有效地处理网络数据流和报文解析。这些接口的名称都非常直观,符合其功能目的,通常用于高效地管理数据流、避免重复读取、并根据需要处理网络报文。