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; } }; }
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); // 延迟断开 } }; }
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."); }