简介

  • mongoose的出站入站缓冲区接口
  • IO缓冲区由结构mg_iobuf描述,是一个简单的数据结构,可以在任意偏移量插入或删除数据块,并自动增长/收缩。

struct mg_iobuf

  • 简介:
    • 通用IO缓冲区。size指定buf指向的数据的分配大小,len指定当前存储的字节数。
  • 原型:
    1
    2
    3
    4
    5
    6
    
    struct mg_iobuf {
    unsigned char *buf;  // Pointer to stored data
    size_t size;         // Total size available
    size_t len;          // Current number of bytes
    size_t align;        // Alignment during allocation
    };
    

mg_iobuf_init

  • 简介:
    • 初始化IO缓冲区,分配字节大小
  • 原型:
    1
    
    int mg_iobuf_init(struct mg_iobuf *io, size_t size, size_t align);
    
  • 参数:
    • io – 要初始化的mg_iobuf结构的指针
    • size – 分配的字节数
    • align – 将大小对齐到对齐内存边界。0表示不对齐
  • 返回值:
    • 1 – 成功
    • 0 – 失败
  • 示例:
    1
    2
    3
    4
    
    struct mg_iobuf io;
    if (mg_iobuf_init(&io, 0, 64)) {
    // io successfully initialized
    }
    

mg_iobuf_resize

  • 简介:
    • 调整IO缓冲区的大小,将新的大小设置为size。在此之后,io->buf指针可能会发生变化,例如缓冲区变大。如果size为0,则释放io->buf并将其设置为NULL,同时将size和len都设置为0。 得到的io->size总是与io->align字节边界对齐;因此,为了避免内存碎片和频繁的重新分配,将io->align设置为更高的值。
  • 原型:
    1
    
    int mg_iobuf_resize(struct mg_iobuf *io, size_t size);
    
  • 参数:
    • io – 需要调整大小的iobuf
    • size – 新的大小
  • 返回值:
    • 1 – 成功
    • 0 – 失败
  • 示例: ```cpp struct mg_iobuf io; mg_iobuf_init(&io, 0, 10); // An empty buffer with 10-byte alignment

if (mg_iobuf_resize(&io, 1)) { // New io size is 10 }

1
2
3
4
5
6
7
8
9
10
11

---

## mg_iobuf_free

+ 简介:
  + 释放io->buf指向的内存并设置为NULL。size和len都被设置为0。

+ 原型:
```cpp
void mg_iobuf_free(struct mg_iobuf *io);
  • 参数:
    • io – 需要释放的iobuf
  • 返回值:
  • 示例: ```cpp struct mg_iobuf io; // IO buffer initialization // …

// Time to cleanup mg_iobuf_free(&io);

1
2
3
4
5
6
7
8
9
10
11

---

## mg_iobuf_add 

+ 简介:
  + 在偏移量处插入数据缓冲区buf、len。如果需要,iobuf将被扩展。产生的io->size总是与io->align字节边界对齐;因此,为了避免内存碎片和频繁的重新分配,将align设置为一个较大的值。

+ 原型:
```cpp
size_t mg_iobuf_add(struct mg_iobuf *io, size_t offset, const void *buf, size_t len);
  • 参数:
    • io – 需要追加数据的iobuf
    • offset – 追加数据的偏移
    • buf – 追加的数据
    • len – 追加数据的长度
  • 返回值:
    • 更新后iobuf的长度
  • 示例:
    1
    2
    3
    
    struct mg_iobuf io;         // Declare buffer
    mg_iobuf_init(&io, 0, 16);  // Initialise empty buffer with 16 byte alignment
    mg_iobuf_add(&io, io.len, "hello", 5);  // Append "hello"
    

mg_iobuf_del

  • 简介:
    • 删除从偏移量开始的len字节,并移动剩余的字节。如果len大于io->len,则不会发生任何操作,因此这种调用会被忽略。
  • 原型:
    1
    
    size_t mg_iobuf_del(struct mg_iobuf *io, size_t offset, size_t len);
    
  • 参数:
    • io – 需要删除数据的iobuf
    • offset – 开始位置的偏移量
    • len – 删除的字节数
  • 返回值:
    • 更新后iobuf的长度
  • 示例:
    1
    2
    3
    4
    
    struct mg_iobuf io;
    mg_iobuf_init(&io, 0, 16);          // Empty buffer, 16-bytes aligned
    mg_iobuf_add(&io, 0, "hello", 2);   // io->len is 5, io->size is 16
    mg_iobuf_del(&io, 1, 3);            // io->len is 2, io->size is still 16