コード例 #1
0
ファイル: GameSocketHost.cs プロジェクト: WaylandGod/Scut
        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);
        }
コード例 #2
0
ファイル: GameWebSocketHost.cs プロジェクト: file1987/Scut
        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);
        }
コード例 #3
0
ファイル: GameSocketHost.cs プロジェクト: ioying/Scut
        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);
            }
        }