kcp icon indicating copy to clipboard operation
kcp copied to clipboard

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

Open sunzj opened this issue 3 years ago • 1 comments

使用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;
}
}

sunzj avatar Dec 10 '21 13:12 sunzj

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

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

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

sunzj avatar Dec 15 '21 14:12 sunzj