kcp-go
kcp-go copied to clipboard
掉线问题
你好,我们使用kcp-go(版本5.4.20)作为接入网关服务器的协议,服务器部署在美国硅谷的腾讯云机房,客户端使用 https://github.com/limpo1989/kcp-csharp 测试的时候,没有什么发生问题,而且实测也看到确实对于传输有效果 所以我们在正式线上找了一个时间,讲服务器的传输模式全都切换成了kcp 总共在线用户大概是300左右,我们发现切换完成之后,在不定时的一段时间之后,服务器这边有大量超时,造成用户掉线 我们使用kcp的代码如下
//侦听udp端口
var kcpListener net.Listener
if cfg.UdpPort != 0 {
addr := fmt.Sprintf(":%d", cfg.UdpPort)
if kcpListener, err = kcp.Listen(addr); err != nil {
panic(err)
}
log.Printf("listening on udp port:%s\n", tcpListener.Addr().String())
}
...
//accept 客户端连接
for {
c, err := kcpListener .Accept()
if err != nil {
//打log
continue
}
go handleConn(c)
}
.....
func handleConn(c net.Conn) (err error) {
conn := newConn(c)
pkt, err := conn.ReadPacket()
if err != nil {
conn.Close()
return
}
uid := pkt.GetUID()
sess := newSession(uid, conn)
value, loaded := userSessionPool.LoadOrStore(uid, sess)
if loaded {
//做一些逻辑
}
// serverLoop用户不停读取内网逻辑服务器的请求,然后发送给客户端
go sess.serverLoop()
//destrop用于关闭客户端和逻辑服务器的连接
defer sess.destory()
//clientLoop不停读取客户端的kcp的请求,然后relay给内网的逻辑服务器
sess.clientLoop()
return
}
我们的网关上面同时有tcpListener和kcpListener,他们的逻辑是一样的,仅仅在Listen的时候有一些区别,当出现问题之后,我们把客户端的协议改成原有走tcp的协议,就没有发生过read timeout的问题
不清楚啊, SetReadTimeout?
有设置ReadTimeout,时间为3分钟 请问你的 邮箱是多少?我可以把srv源码发你看看吗?
ReadTimeout是deadline,是绝对值,每次都需要SetReadDeadline(time.Now().Add(timeout))
是用了绝对值的,SetReadDeadline(time.Now().Add(3*time.Minute))
你需要检查下client library有没有bug, 服务器端是经过大量用户良好测试的。
客户端是这个库:https://github.com/limpo1989/kcp-csharp
也怀疑过客户端的bug,不过有一个现象不太好解释,就是跑了一段时间之后,大量的用户同时出现time out,我的邮箱是[email protected],可否给我发一个邮件,麻烦你有时间的时候指导一下,看看我们有没有哪个地方用错了或者什么潜在的问题,万分感谢~
你好,大神,我们愿意付费支持,该如何联系你?
你把问题和相关资料,发我邮箱[email protected],我空了回复。
谢谢! 已经给你发邮件了
建议参考 #183 排查下问题 @yushengery
您好,请问下问题解决了吗,我也遇到了类似问题