每个数据包写入ringbuffer的存储结构:
packet_size:uint16 | packet_ctx:byte[ ]
整个ringbuffer的结构:
----------<——start:读的位置
packet1
----------
packet2
--------<——start+use:写的位置
……
type Ringbuffer struct{
start,use int
buf []byte
}
ringbuffer中buf为存储数据内容,start为读的位置的index,use为ringbuffer中未读数据包的字节数,start+
use便是写的位置。
实现要点一:绕回
ringbuffer是一个环,写入到尾部之后需要绕回到尾部,由于数据包是不定大小,所以到了尾部可能会出现数
据包一半在尾部一半在开头,对应的读取的时候数据包一半在尾部,一半在开头需要把它们合并起来。
实现要点二:写入过快,释放覆盖
当写入速度大于读取速度时,新写入数据会与未读数据发生覆盖,这样就有两种决策:覆盖未读数据和丢弃新
写入数据。
实现要点三:避免重复读取
由于ringbuffer是通过覆盖写入数据,并不会删除未读数据,所以就通过ringbuffer中的use来判断是否还