kcp 如何安全的清理KCP中未发送的数据

muk1a3rh  于 2022-10-25  发布在  其他
关注(0)|答案(1)|浏览(276)

使用KCP传送PCM的音频,当一首歌结束后,因为网络延时原因,还有部分数据缓存在KCP中,如何安全的将未发送的数据清理掉?以下实现可以不?

void ikcp_clearsnd(ikcpcb *kcp)
{
if(kcp) {
IKCPSEG *seg;
while (!iqueue_is_empty(&kcp->snd_buf)) {
seg = iqueue_entry(kcp->snd_buf.next, IKCPSEG, node);
iqueue_del(&seg->node);
ikcp_segment_delete(kcp, seg);
}
while (!iqueue_is_empty(&kcp->snd_queue)) {
seg = iqueue_entry(kcp->snd_queue.next, IKCPSEG, node);
iqueue_del(&seg->node);
ikcp_segment_delete(kcp, seg);
}
kcp->nsnd_buf = 0;
kcp->nsnd_que = 0;
}
}

des4xlb0

des4xlb01#

尝试了一下,kcp->snd_queue里的数据可以安全的清除掉,但snd_buf里的数据不能随便清理,会导致整个的ACK机制混乱。

一个可能的办法是,把sndwnd减少,这样snd_buf内的缓冲的数据会变小,当然可能会影响数据发送的带宽。

期待韦神实现的安全丢包。

相关问题