buffer
优质
小牛编辑
143浏览
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);