kcp
kcp copied to clipboard
同一个会话,断开重连,发相同的数据为什么能够正确收完整?
我实现了基于KCP的一个简单的文件传输功能,程序分为一个发送端,一个接收端,发送端我发一个较大的文件1MB字节,先把整个文件全写入kcp(通过ikcp_send塞入缓冲),然后开始发数据包,发送100K左右我CTRL+C终止发送端,然后重新启动,保持接收端不变化,两段都使用固定的session值为0,我本来觉得应该会出现接收端重复收到数据,但是实测发现文件可以“续传”,怎么实现的?
另外我尝试第一次发送文件A,发了一部分终止后,第二次发文件B,此时这个文件B无法接收,再重启后发送文件A,又可以“续传”,并且接收到的文件二进制比较完全一致。很意外,能麻烦解释一下吗?
关于这个问题我自己简单跟了一下代码,研究重新启动接收端的接受情况,发现由于发送端不知发生了重置,结果接收端收到的数据sn远远超过了窗口最大值,但是代码流程仅仅忽略了这种情况,即目前版本无从知晓对端发生了变化。
一种直观的解决方案为,在数据流中附带保活包,通过这种保活包在两段之间相互传递可以识别可执行程序生命周期的标识。
你都重置了怎么还指望两边的 kcp 对象状态一样呢?
对的,我本来是预期是库会发现异常,然后通过异常值来报告RESET,想太好了呵呵。
@littlewater hello,代码能分享下吗