kcp-go icon indicating copy to clipboard operation
kcp-go copied to clipboard

掉线问题

Open yushengery opened this issue 5 years ago • 17 comments

你好,我们使用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的问题

yushengery avatar Feb 19 '20 07:02 yushengery

不清楚啊, SetReadTimeout?

xtaci avatar Feb 20 '20 08:02 xtaci

有设置ReadTimeout,时间为3分钟 请问你的 邮箱是多少?我可以把srv源码发你看看吗?

yushengery avatar Feb 26 '20 01:02 yushengery

ReadTimeout是deadline,是绝对值,每次都需要SetReadDeadline(time.Now().Add(timeout))

xtaci avatar Feb 26 '20 04:02 xtaci

是用了绝对值的,SetReadDeadline(time.Now().Add(3*time.Minute))

yushengery avatar Feb 27 '20 07:02 yushengery

你需要检查下client library有没有bug, 服务器端是经过大量用户良好测试的。

xtaci avatar Feb 27 '20 07:02 xtaci

客户端是这个库:https://github.com/limpo1989/kcp-csharp

yushengery avatar Feb 27 '20 08:02 yushengery

也怀疑过客户端的bug,不过有一个现象不太好解释,就是跑了一段时间之后,大量的用户同时出现time out,我的邮箱是[email protected],可否给我发一个邮件,麻烦你有时间的时候指导一下,看看我们有没有哪个地方用错了或者什么潜在的问题,万分感谢~

yushengery avatar Feb 27 '20 08:02 yushengery

你好,大神,我们愿意付费支持,该如何联系你?

yushengery avatar Mar 04 '20 07:03 yushengery

你把问题和相关资料,发我邮箱[email protected],我空了回复。

xtaci avatar Mar 04 '20 12:03 xtaci

谢谢! 已经给你发邮件了

yushengery avatar Mar 05 '20 10:03 yushengery

建议参考 #183 排查下问题 @yushengery

histalk avatar Sep 03 '20 02:09 histalk

您好,请问下问题解决了吗,我也遇到了类似问题

89trillion-zhangyun avatar Jun 16 '21 04:06 89trillion-zhangyun