TcpConnection:封装的就是建立连接之后得到的用于通信的文件描述符,然后基于这个文件描述符,在发送数据的时候,需要把数据先写入到一块内存里边,然后再把这块内存里边的数据发送给客户端,除了发送数据,剩下的就是接收数据。接收数据,把收到的数据先存储到一块内存里边。也就意味着,无论是发送数据还是接收数据,都需要一块内存。并且这块内存是需要使用者自己去创建的。所以就可以把这块内存做封装成Buffer。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>学习笔记>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1.文件描述符与数据发送:
- 在发送数据时,需要先将数据写入内存缓冲区(buffer)。
- 内存缓冲区可以通过封装成一个Buffer结构体来实现
- Buffer结构体中包含一个指向内存的指针(data)、内存总大小(capacity)、读数据位置(readPos)和写数据位置(writePos)等成员
2.Buffer结构体及其成员说明:
- 指针:指向内存地址(data)
- 总大小:内存块的字节数(capacity)
- 读位置:当前读取数据的位置(readPos)
- 写位置:当前写入数据的位置(writePos)
3.Buffer API函数:
- 提供一系列API函数,以便对buffer中的内存进行操作
- 主要操作包括初始化buffer和进行读写操作
4.初始化Buffer:
- 需要为buffer申请指定大小的堆内存
- 使用malloc函数申请堆内存,并将内存地址返回给调用者
- 初始化buffer结构体中的成员,包括data指针、容量、读位置和写位置
- data指针需要指向一个有效的内存块,因此需要再次申请内存
- 使用memset函数将data指针指向的内存块初始化为零
- 返回buffer指针给调用者
>>>>>>>>>>>>>>>>>>>>>>>>>>>>Buffer的创建和销毁>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- Buffer.h
struct Buffer {
// 指向内存的指针
char* data;
int capacity;
int readPos;
int writePos;
}
(一)Buffer的初始化
// 初始化
struct Buffer* bufferInit(int size);
// 初始化
struct Buffer* bufferInit(int size) {
struct Buffer* buffer = (struct Buffer*)malloc(sizeof(struct Buffer));
if(buffer!=NULL) {
buffer->data = (char*)malloc(sizeof(char) * size);
buffer->capacity = size;
buffer->readPos = buffer->writePos = 0;
memset(buffer->data, 0, size);
}
return buffer;
}
(二)Buffer的销毁
// 销毁
void bufferDestroy(struct Buffer* buf);
// 销毁
void bufferDestroy(struct Buffer* buf) {
if(buf!=NULL) {
if(buf->data!=NULL) { // buf->data指向有效的堆内存
free(buf->data); // 释放
}
}
free(buf);
}