当前位置: 首页 > 文档资料 > Swoole 内核开发 >

buffer

优质
小牛编辑
144浏览
2023-12-01

buffer分为2个类型,简单的conn_buffer和data_buffer conn_buffer是一个固定尺寸的buffer,使用EOF检测然后不断填充buffer区,直到有EOF或者超过buffer区的尺寸,将发送给worker进程去处理。

data_buffer设计较为复杂,可以缓存大量的数据,直到有EOF到达。才将所有数据一次性全部发送给worker。

swDataBuffer_item

每一个连接的fd都会对应一个item,通过swDataBuffer_getItem来得到。参数就是连接的文件描述符。

swDataBuffer_getItem(data_buffer, event->fd);

如果返回了NULL,说明是第一次发送数据,需要为其创建一个item

swDataBuffer_item *buffer_item = swDataBuffer_newItem(data_buffer, event->fd, SW_BUFFER_SIZE);

swDataBuffer_trunk

swDataBuffer_item并不保存数据,真正的数据要保存到trunk中。通过swDataBuffer_getTrunk函数来得到数据trunk。trunk拥有一块内存区域,可以用来保存recv到的数据。 连接的buffer item上可能会有很多个trunk,他们以链表的方式存储,swDataBuffer_getTrunk总会得到最后一个trunk。当此trunk写满时需要创建一个新的trunk。 当收到EOF时,将所有的trunk依次发给worker进程。

trunk = swDataBuffer_getTrunk(data_buffer, buffer_item);