xtaci / kcp-go

A Crypto-Secure Reliable-UDP Library for golang with FEC
MIT License
4.08k stars 733 forks source link

掉线问题 #162

Open yushengery opened 4 years ago

yushengery commented 4 years ago

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

xtaci commented 4 years ago

不清楚啊, SetReadTimeout?

yushengery commented 4 years ago

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

xtaci commented 4 years ago

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

yushengery commented 4 years ago

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

xtaci commented 4 years ago

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

yushengery commented 4 years ago

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

yushengery commented 4 years ago

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

yushengery commented 4 years ago

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

xtaci commented 4 years ago

你把问题和相关资料,发我邮箱imap@live.com,我空了回复。

yushengery commented 4 years ago

谢谢! 已经给你发邮件了

histalk commented 4 years ago

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

89trillion-zhangyun commented 3 years ago

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

FlashFeiFei commented 5 months ago

解决了吗? 我也遇到掉线问题,但是不需要怎么多用户,我这边一个用户以上就可以出现问题,只要其中一个掉线了,服务器就会对所有客户端停止转发数据。掉线的客户端、新来的客户端、再也连接不上服务器,已连接的客户端会被停止转发数据

xtaci commented 5 months ago

用smux v2

xtaci commented 5 months ago

"smuxver": 2,

FlashFeiFei commented 5 months ago

"smuxver": 2, 在哪里?我在kcp-go库里面找不到这个设置

FlashFeiFei commented 5 months ago

我的kcp-go是5.6.8版本