苏宁易购网站建设的思路,在线电影网站建设论文,网站开发 文档,做暖暖视频免费观看免费网站项目完整版在#xff1a;
一、buffer模块#xff1a; 缓冲区模块 Buffer模块是一个缓冲区模块#xff0c;用于实现通信中用户态的接收缓冲区和发送缓冲区功能。
二、提供的功能
存储数据#xff0c;取出数据
三、实现思想
1.实现换出去得有一块内存空间#xff0c;采…项目完整版在
一、buffer模块 缓冲区模块 Buffer模块是一个缓冲区模块用于实现通信中用户态的接收缓冲区和发送缓冲区功能。
二、提供的功能
存储数据取出数据
三、实现思想
1.实现换出去得有一块内存空间采用vector ,vector底层是一个线性的内存空间
一要素
1.默认空间大小 2.当前的读取数据位置 3.当前的写入数据位置
二操作
写入位置 当前写入位置指向哪里从哪里开始写入 如果后续剩余空间不够了考虑整体缓冲区空闲空间是否足够因为读位置也会向后偏移前后有可能有空闲空间 足够将数据移动到起始位置 不够扩容从当前写位置开始扩容足够大小 数据一旦写入成功当前写位置向后偏移读取数据 当前的读取位置指向哪里就从哪里开始读取前提是有数据可读 可读数据大小当前写入位置减去当前读取位置
三框架设计
class buffer {private:std::vectorchar _buffer;// 位置是一个相对偏移量而不是绝对地址uint64_t _read_idx; // 读位置uint64_t _write_idx; // 写位置public:1. 获取当前写的位置2. 确保可写空间足够3. 获取前沿空间大小4. 获取后沿空间大小5. 将写入据位置向后移动指定长度6. 获取当前读取位置的地址7. 获取可读空间大小8. 将读位置向后移动指定长度9. clear四、实现代码
#include ctime
#include cstring
#include iostream
#include vector
#include cassert
#include string
using namespace std;
#define BUFFER_SIZE 1024
class Buffer {private:std::vectorchar _buffer; // 使用vector进行内存空间管理uint64_t _read_idx; // 读偏移uint64_t _write_idx; // 写偏移public:Buffer():_read_idx(0),_write_idx(0),_buffer(BUFFER_SIZE) {}char* begin() {return *_buffer.begin();}// 获取当前写入起始地址char *writePosition() { return begin() _write_idx;}// 获取当前读取起始地址char *readPosition() { return begin() _read_idx; }// 获取缓冲区末尾空间大小 —— 写偏移之后的空闲空间总体大小减去写偏移uint64_t tailIdleSize() {return _buffer.size() - _write_idx; }// 获取缓冲区起始空间大小 —— 读偏移之前的空闲空间uint64_t handIdleSize() {return _read_idx ;}// 获取可读空间大小 写偏移 - 读偏移 uint64_t readAbleSize() {return _write_idx - _read_idx ;} // 将读偏移向后移动void moveReadOffset(uint64_t len) { // 向后移动大小必须小于可读数据大小assert(len readAbleSize());_read_idx len; }// 将写偏移向后移动void moveWriteOffset(uint64_t len) { assert(len tailIdleSize());_write_idx len;}void ensureWriteSpace(uint64_t len) {// 确保可写空间足够 整体空间够了就移动数据否则就扩容 if (tailIdleSize() len) return;// 不够的话 判断加上起始位置够不够,够了将数据移动到起始位置if (len tailIdleSize() handIdleSize()) {uint64_t rsz readAbleSize(); //帮当前数据大小先保存起来std::copy(readPosition(),readPosition() rsz,begin()); // 把可读数据拷贝到起始位置_read_idx 0; // 读归为0_write_idx rsz; // 可读数据大小是写的偏移量}else { // 总体空间不够需要扩容不移动数据直接给写偏移之后扩容足够空间即可_buffer.resize(_write_idx len);}}// 写入数据void Write(const void *data,uint64_t len) {ensureWriteSpace(len);const char *d (const char*) data;std::copy(d,d len,writePosition());}void WriteAndPush(void* data,uint64_t len) {Write(data,len);moveWriteOffset(len);}void WriteStringAndPush(const std::string data) {writeString(data);moveWriteOffset(data.size());}void writeString(const std::string data) {return Write(data.c_str(),data.size());}void writeBuffer(Buffer data) {return Write(data.readPosition(),data.readAbleSize());}void writeBufferAndPush(Buffer data) {writeBuffer(data);moveWriteOffset(data.readAbleSize());}std::string readAsString (uint64_t len) {assert(len readAbleSize());std::string str;str.resize(len);Read(str[0],len);return str;}void Read(void *buf,uint64_t len) {// 读取数据 1. 保证足够的空间 2.拷贝数据进去// 要求获取的大小必须小于可读数据大小assert(len readAbleSize());std::copy(readPosition(),readPosition() len,(char*)buf);}void readAndPop(void *buf,uint64_t len) {Read(buf,len);moveReadOffset(len);}// 逐步调试std::string ReadAsStringAndPop(uint64_t len) {assert(len readAbleSize());std::string str readAsString(len);moveReadOffset(len);return str;}char* FindCRLF() {char *res (char*)memchr(readPosition(),\n,readAbleSize());return res;}// 通常获取一行数据这种情况针对是std::string getLine() {char* pos FindCRLF();if (pos NULL) {return ;}// 1 为了把换行数据取出来return readAsString(pos - readPosition() 1);}std::string getLineAndPop() {std::string str getLine();moveReadOffset(str.size());return str;}void Clear() { // 清空缓冲区clear// 只需要将偏移量归0即可_read_idx 0;_write_idx 0;}
};五、进行测试
#include server.hpp
using namespace std;
// 控制打印信息
#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL INF#define LOG(level,format,...) do{\if (level LOG_LEVEL) break;\time_t t time(NULL);\struct tm *ltm localtime(t);\char tmp[23] {0};\strftime(tmp,31,%H:%M:%S,ltm);\fprintf(stdout,[%s,%s:%d] format \n,tmp,__FILE__,__LINE__,##__VA_ARGS__);\
}while(0)#define INF_LOG(format, ...) LOG(INF, format, ##__VA_ARGS__)
#define DBG_LOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ERR_LOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)int main() {Buffer buf;std::string str hello!;// buf.WriteStringAndPush(str);// Buffer buf1;// buf1.writeBufferAndPush(buf);// std::string tmp;// tmp buf1.ReadAsStringAndPop(buf.readAbleSize());// cout tmp endl;// cout buf.readAbleSize() endl;// cout buf1.readAbleSize() endl;for (int i 0; i 300; i ) {std::string str hello std::to_string(i) \n;buf.WriteStringAndPush(str);}while(buf.readAbleSize() 0) {string line buf.getLineAndPop();LOG(hello); }// string tmp;// tmp buf.ReadAsStringAndPop(buf.readAbleSize());// cout tmp endl;return 0;
}中秋快乐