-
Notifications
You must be signed in to change notification settings - Fork 2.6k
服务端重启后链路无法恢复 #439
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
废话,你服务端重启了,原有 tcp 连接还能接着用么? |
业务层不通过类似心跳或确认机制的话不知道服务器重启了KCP连接不能用了啊。举个例子,kcp通道转发数据,此时解决这个问题需要重启kcp通道客户端,还不是说原客户端自己重连就能解决的。 |
你别搞笑了,UDP 没状态,KCP 是有状态的啊;就像 IP 没状态,TCP 是有状态的啊;TCP 怎么处理 KCP 就怎么处理;服务器都重启了,你凭啥想指望旧的客户端 KCP 对象还可以同新的服务端 KCP 对象通信?有点基础知识行不行,两边全部重建新的 KCP 对象再连接; |
今天用了你的库,写的非常棒,遇到了实实在在的问题,也看了代码,问题描述的也很清楚,我两次发言问的是: |
心跳不是 kcp 的事情,请自己在连接层增加 UDP 心跳,自己判断断线。 |
好的,谢谢。 |
因为服务端重启,重启后收到数据通过
ikcp_parse_data
中if (seg->sn == kcp->rcv_nxt && kcp->nrcv_que < kcp->rcv_wnd)
判断入队列,此时conv
一致,可惜的是seg->sn
是之前递增的值,kcp->rcv_nxt
将始终为0. 导致数据未入rcv_queue
相当于未真正“接收”,因为ikcp_recv
中的if (iqueue_is_empty(&kcp->rcv_queue)) return -1;
那么此时同步
sn
只能在客户端新建kcp对象吗?这个意思是否只能是业务层通过类似心跳的机制判断此时的服务器数据未真正接收(网卡收到了但是业务层未收到),然后重连?The text was updated successfully, but these errors were encountered: