使用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;
}
}
1条答案
按热度按时间des4xlb01#
尝试了一下,kcp->snd_queue里的数据可以安全的清除掉,但snd_buf里的数据不能随便清理,会导致整个的ACK机制混乱。
一个可能的办法是,把sndwnd减少,这样snd_buf内的缓冲的数据会变小,当然可能会影响数据发送的带宽。
期待韦神实现的安全丢包。