private GameSession GetSession(ConnectionEventArgs e, RequestPackage package) { //使用代理分发器时,每个ssid建立一个游服Serssion GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? (package.IsProxyRequest ? GameSession.Get(e.Socket.HashCode) : GameSession.CreateNew(package.ProxySid, e.Socket, socketLintener.PostSend)); if (session != null) { session.ProxySid = package.ProxySid; } } else { session = GameSession.Get(package.SessionId) ?? GameSession.Get(e.Socket.HashCode); } if (session != null && !session.Connected) { GameSession.Recover(session, e.Socket.HashCode, e.Socket, socketLintener.PostSend); } return(session); }
private GameSession GetSession(ConnectionEventArgs e, RequestPackage package) { //使用代理分发器时,每个ssid建立一个游服Serssion GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? (package.IsProxyRequest ? GameSession.Get(e.Socket.HashCode) : GameSession.CreateNew(package.ProxySid, e.Socket, socketListener)); if (session != null) { session.ProxySid = package.ProxySid; } } else { session = GameSession.Get(package.SessionId) ?? GameSession.Get(e.Socket.HashCode); } if (session == null) { session = GameSession.CreateNew(package.ProxySid, e.Socket, socketListener); } if ((!session.Connected || !Equals(session.RemoteAddress, e.Socket.RemoteEndPoint.ToString()))) { GameSession.Recover(session, e.Socket.HashCode, e.Socket, socketListener); } return(session); }
private void socketLintener_DataReceived(object sender, ConnectionEventArgs e) { try { Interlocked.Increment(ref receiveNum); OnReceivedBefore(e); //if (isInStopping) return; Dictionary <string, string> param = new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase); string paramStr = Encoding.ASCII.GetString(e.Data); int index = paramStr.IndexOf("?d="); string routeName = string.Empty; if (index != -1) { if (paramStr.StartsWith("route:", StringComparison.CurrentCultureIgnoreCase)) { routeName = paramStr.Substring(6, index - 6); } paramStr = paramStr.Substring(index, paramStr.Length - index); paramStr = HttpUtility.ParseQueryString(paramStr)["d"]; } var nvc = HttpUtility.ParseQueryString(paramStr); foreach (var key in nvc.AllKeys) { param[key] = nvc[key]; } if (param.ContainsKey("route")) { routeName = param["route"]; } //if (!param.ContainsKey("ssid")) { Interlocked.Increment(ref errorDropNum); return; } if (!param.ContainsKey("actionid")) { Interlocked.Increment(ref errorDropNum); return; } if (!param.ContainsKey("msgid")) { Interlocked.Increment(ref errorDropNum); return; } //sessionId of proxy server Guid proxySid; if (!param.ContainsKey("ssid") || !Guid.TryParse(param["ssid"], out proxySid)) { proxySid = Guid.Empty; } int actionid; if (!int.TryParse(param["actionid"], out actionid)) { Interlocked.Increment(ref errorDropNum); return; } int msgid; if (!int.TryParse(param["msgid"], out msgid)) { Interlocked.Increment(ref errorDropNum); return; } bool isproxy = param.ContainsKey("isproxy");//proxy server send string sessionId = param.ContainsKey("sid") ? param["sid"] : ""; //使用代理分发器时,每个ssid建立一个游服Serssion GameSession session; if (proxySid != Guid.Empty) { session = GameSession.Get(proxySid) ?? (isproxy ? GameSession.Get(e.Socket.HashCode) : GameSession.CreateNew(proxySid, e.Socket, socketLintener.PostSend)); session.ProxySid = proxySid; } else { session = GameSession.Get(e.Socket.HashCode); } if (session != null && !session.Connected) { GameSession.Recover(session, e.Socket.HashCode, e.Socket, socketLintener.PostSend); } if (actionid == (int)ActionEnum.Interrupt) { //Proxy server notifly interrupt connect ops OnDisconnected(session); if (session != null && (session.ProxySid == Guid.Empty || GameSession.Count > 1)) { //保留代理服连接 session.Close(); session.ProxySid = Guid.Empty; } return; } requestQueue.Enqueue(new RequestPackage { Route = routeName, ActionId = actionid, Param = paramStr, Session = session, ReceiveTime = DateTime.Now }); singal.Set(); } catch (Exception ex) { TraceLog.WriteError("Received to Host:{0} error:{1}", e.Socket.RemoteEndPoint, ex); } }