예제 #1
0
        private async Task Process(Socket acceptedSocket)
        {
            var session = _sessionPool.Take();

            session.Attach(acceptedSocket);

            if (_sessions.TryAdd(session.SessionKey, session))
            {
//                _log.DebugFormat("New session [{0}].", session);
                try
                {
                    await session.Start();
                }
                finally
                {
                    TcpSocketSaeaSession recycle;
                    if (_sessions.TryRemove(session.SessionKey, out recycle))
                    {
//                        _log.DebugFormat("Close session [{0}].", recycle);
                    }
                }
            }

            _sessionPool.Return(session);
        }
        public void ConnectToServer(IPEndPoint ipEndPoint)
        {
            Socket socket  = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            var    awaiter = HandlerSaeaPool.Take();

            awaiter.Saea.RemoteEndPoint = ipEndPoint;

            SaeaExHelper.ConnectAsync(socket, awaiter, (a, e) =>
            {
                HandlerSaeaPool.Return(a);
                var session = SessionPool.Take();
                if (e != SocketError.Success)
                {
                    LogHelper.WriteLog("client_connect-error");
                    CompletetionNotify?.Invoke(TcpSocketCompletionNotify.OnClosed, session);
                    SessionPool.Return(session);
                    return;
                }
                TcpSocketSaeaSessions.Add(session);

                session.Attach(socket);
                CompletetionNotify?.Invoke(TcpSocketCompletionNotify.OnConnected, session);
                session.StartProcess();
            });
        }