public void Remove(SocketSession session)
        {
            ClearWriteRequestQueue(session);

            if (session.Socket.Connected)
            {
                try
                {
                    session.Socket.Shutdown(System.Net.Sockets.SocketShutdown.Send);
                }
                catch { /* the session has already closed */ }
            }
            session.Socket.Close();

            IoServiceSupport support = session.Service as IoServiceSupport;

            if (support != null)
            {
                try
                {
                    support.FireSessionDestroyed(session);
                }
                catch (Exception e)
                {
                    // The session was either destroyed or not at this point.
                    // We do not want any exception thrown from this "cleanup" code.
                    session.FilterChain.FireExceptionCaught(e);
                }
            }
        }
示例#2
0
        /// <inheritdoc/>
        public void Remove(AsyncDatagramSession session)
        {
            SessionRecycler.Remove(session);
            IoServiceSupport support = session.Service as IoServiceSupport;

            if (support != null)
            {
                support.FireSessionDestroyed(session);
            }
        }
示例#3
0
        private void Remove(SerialSession session)
        {
            session.SerialPort.Close();
            IoServiceSupport support = session.Service as IoServiceSupport;

            if (support != null)
            {
                support.FireSessionDestroyed(session);
            }
        }
示例#4
0
        private void Add(SerialSession session)
        {
            // Build the filter chain of this session.
            session.Service.FilterChainBuilder.BuildFilterChain(session.FilterChain);

            // Propagate the SESSION_CREATED event up to the chain
            IoServiceSupport serviceSupport = session.Service as IoServiceSupport;

            if (serviceSupport != null)
            {
                serviceSupport.FireSessionCreated(session);
            }

            session.Start();
        }
示例#5
0
 public void Remove(LoopbackSession session)
 {
     lock (session.Lock)
     {
         if (!session.CloseFuture.Closed)
         {
             IoServiceSupport support = session.Service as IoServiceSupport;
             if (support != null)
             {
                 support.FireSessionDestroyed(session);
             }
             session.RemoteSession.Close(true);
         }
     }
 }
示例#6
0
        public void Remove(SocketSession session)
        {
            ClearWriteRequestQueue(session);

            if (session.Socket.Connected)
            {
                try
                {
                    session.Socket.Shutdown(System.Net.Sockets.SocketShutdown.Send);
                }
                catch { /* the session has already closed */ }
            }
            session.Socket.Close();

            IoServiceSupport support = session.Service as IoServiceSupport;

            if (support != null)
            {
                support.FireSessionDestroyed(session);
            }
        }
示例#7
0
        private IoSession NewSessionWithoutLock(EndPoint remoteEP, SocketContext ctx)
        {
            IoSession session;

            lock (_sessionRecycler)
            {
                session = _sessionRecycler.Recycle(remoteEP);

                if (session != null)
                {
                    return(session);
                }

                // If a new session needs to be created.
                session = new AsyncDatagramSession(this, this, ctx, remoteEP, ReuseBuffer);
                _sessionRecycler.Put(session);
            }

            InitSession <IoFuture>(session, null, null);

            try
            {
                FilterChainBuilder.BuildFilterChain(session.FilterChain);

                IoServiceSupport serviceSupport = session.Service as IoServiceSupport;
                if (serviceSupport != null)
                {
                    serviceSupport.FireSessionCreated(session);
                }
            }
            catch (Exception ex)
            {
                ExceptionMonitor.Instance.ExceptionCaught(ex);
            }

            return(session);
        }
示例#8
0
        /// <inheritdoc/>
        protected override IConnectFuture Connect0(EndPoint remoteEP, EndPoint localEP, Action <IoSession, IConnectFuture> sessionInitializer)
        {
            LoopbackPipe entry;

            if (!LoopbackAcceptor.BoundHandlers.TryGetValue(remoteEP, out entry))
            {
                return(DefaultConnectFuture.NewFailedFuture(new IOException("Endpoint unavailable: " + remoteEP)));
            }

            DefaultConnectFuture future = new DefaultConnectFuture();

            // Assign the local end point dynamically,
            LoopbackEndPoint actualLocalEP;

            try
            {
                actualLocalEP = NextLocalEP();
            }
            catch (IOException e)
            {
                return(DefaultConnectFuture.NewFailedFuture(e));
            }

            LoopbackSession localSession = new LoopbackSession(this, actualLocalEP, Handler, entry);

            InitSession(localSession, future, sessionInitializer);

            // and reclaim the local end point when the connection is closed.
            localSession.CloseFuture.Complete += ReclaimLocalEP;

            // initialize connector session
            try
            {
                IoFilterChain filterChain = localSession.FilterChain;
                this.FilterChainBuilder.BuildFilterChain(filterChain);

                // The following sentences don't throw any exceptions.
                IoServiceSupport serviceSupport = this as IoServiceSupport;
                if (serviceSupport != null)
                {
                    serviceSupport.FireSessionCreated(localSession);
                }
            }
            catch (Exception ex)
            {
                future.Exception = ex;
                return(future);
            }

            // initialize acceptor session
            LoopbackSession remoteSession = localSession.RemoteSession;

            ((LoopbackAcceptor)remoteSession.Service).DoFinishSessionInitialization(remoteSession, null);
            try
            {
                IoFilterChain filterChain = remoteSession.FilterChain;
                entry.Acceptor.FilterChainBuilder.BuildFilterChain(filterChain);

                // The following sentences don't throw any exceptions.
                IoServiceSupport serviceSupport = entry.Acceptor as IoServiceSupport;
                if (serviceSupport != null)
                {
                    serviceSupport.FireSessionCreated(remoteSession);
                }
            }
            catch (Exception ex)
            {
                ExceptionMonitor.Instance.ExceptionCaught(ex);
                remoteSession.Close(true);
            }

            // Start chains, and then allow and messages read/written to be processed. This is to ensure that
            // sessionOpened gets received before a messageReceived
            ((LoopbackFilterChain)localSession.FilterChain).Start();
            ((LoopbackFilterChain)remoteSession.FilterChain).Start();

            return(future);
        }