Ejemplo n.º 1
0
    public void OnAccept(xx.UvTcpPeer peer)
    {
        Console.WriteLine("client peer [" + peer.ip + "] accepted.");

        peer.OnReceiveRequest = (serial, bbRecv) =>
        {
            // 试着解码. 失败直接断开
            var recv = bbRecv.TryReadRoot<xx.IObject>();
            if (recv == null)
            {
                peer.Dispose();
                return;
            }

            Console.WriteLine("client peer " + peer.ip + " recv: " + recv);

            // 分发到处理函数
            switch (recv)
            {
                case PKG.Client_Login.Auth a:
                    Handle_Auth(serial, a, peer);
                    break;
                default:
                    peer.Dispose();
                    return;
            }
        };
    }
Ejemplo n.º 2
0
    public void OnAccept(xx.UvTcpPeer peer)
    {
        // 首次建立连接时, 身份不明, 先 bind 身份检测函数
        peer.OnReceivePackage = (bb) =>
        {
            // 试着解包
            var pkg = bb.TryReadRoot <xx.IObject>();

            // 如果解包失败, 立即踢掉
            if (pkg == null)
            {
                peer.Dispose();
                return;
            }

            // 对于匿名连接, 先进行 ServiceInfo 检测. 如果收到其他类型的包, 直接踢掉
            int r = 0;
            switch (pkg)
            {
            case PKG.Generic.ServerInfo si:
                r = HandleServerInfo(si, peer);
                break;

            default:
                r = -1;
                break;
            }

            // 判断处理结果
            if (r == 0)                     // 正确执行, 保持连接
            {
            }
            else if (r < 0)                 // 处理失败
            {
                peer.Dispose();             // 直接断开
            }
            else                            // r > 0
            {
                peer.DelayRelease(r);       // 延迟断开
            }
        };
    }
Ejemplo n.º 3
0
    public void SetLoginPeer(xx.UvTcpPeer peer)
    {
        if (loginPeer != null && loginPeer.alive)
        {
            loginPeer.Send(new PKG.Generic.Error {
                number = -1, text = "another login server connected."
            });
            loginPeer.DelayRelease(1);
        }
        loginPeer = peer;

        loginPeer.OnReceivePackage = null;
        loginPeer.OnReceiveRequest = (serial, bb) =>
        {
            // 试着解包
            var pkg = bb.TryReadRoot <xx.IObject>();

            // 如果解包失败, 立即踢掉 并 清掉
            if (pkg == null)
            {
                loginPeer.Dispose();
                loginPeer = null;
                return;
            }

            Console.WriteLine("recv server_login package: " + pkg);

            // 根据请求来分发到处理函数
            switch (pkg)
            {
            case PKG.Login_DB.Auth a:
                Handle_Login_Auth(serial, a, peer);
                break;

            default:
                Console.WriteLine("unhandled pkg: ", pkg);
                break;
            }
        };

        Console.WriteLine("server_login connected.");
    }