protected virtual void OnSessionAccepted(Listener listener, Socket socket) { if (Stopped.IsTrue()) return; // TODO 여기서 동접 체크? SocketAsyncEventArgs recvSAEA; if (!m_RecvSAEAPool.TryPop(out recvSAEA)) { Task.Run(() => { socket.CloseEx(); }); Logger.Error(string.Format("Max connection number {0} was reached!", m_ServerConfig.MaxConnectionNumber)); return; } SocketAsyncEventArgs sendSAEA; if (!m_SendSAEAPool.TryPop(out sendSAEA)) { Task.Run(() => { socket.CloseEx(); }); Logger.Error(string.Format("Max connection number {0} was reached!", m_ServerConfig.MaxConnectionNumber)); return; } Session session = CreateSession(socket, recvSAEA, sendSAEA); if (session == null) { recvSAEA.UserToken = null; sendSAEA.UserToken = null; m_RecvSAEAPool.Push(recvSAEA); m_SendSAEAPool.Push(sendSAEA); Task.Run(() => { socket.CloseEx(); }); return; } session.Connected += OnSessionConnected; session.Disconnected += OnSessionDisconnected; session.Received += OnSessionReceived; session.Error += OnSessionError; long sessionID = GenerateSessionID(); session.SetSessionID(sessionID); m_Sessions.TryAdd(sessionID, session); session.OnConnected(); // TODO session.StartReceive(); Logger.Debug(string.Format("OnSessionAccepted:{0}", session.m_ID)); }
void OnListenerError(Listener listener, Exception e) { Logger.Error(string.Format("Listener ({0}) error: {1}", listener.m_Config.EndPoint, e.Message), e); }
public virtual bool ServerStart() { Logger.Info("ServerStart"); for (var i = 0; i < m_ServerConfig.Listeners.Length; i++) { var listener = new Listener(m_ServerConfig.Listeners[i], this); listener.Error += new Listener.ErrorHandler(OnListenerError); listener.Accepted += new Listener.AcceptHandler(OnSessionAccepted); if (listener.Start(m_ServerConfig)) { m_Listeners.Add(listener); Logger.Info(string.Format("Listener ({0}) was started", listener.m_Config.EndPoint)); } else { Logger.Info(string.Format("Listener ({0}) failed to start", listener.m_Config.EndPoint)); for (var j = 0; j < m_Listeners.Count; j++) { m_Listeners[j].Stop(); } m_Listeners.Clear(); return false; } } Running.ForceTrue(); return true; }