예제 #1
0
        /// <summary>ICHANNEL Reset</summary>
        void IChannel.Reset()
        {
            // Restarts sequences
            ExpectedSequence = 0;
            Sequence         = 0;

            // Clean the tables
            Attempts.Clear();
            Contents.Clear();
            Cached.Clear();
            Acks.Clear();

            // Muted
            Muted = false;
        }
예제 #2
0
        /// <summary>Process</summary>
        private void Process()
        {
            // Puts running
            Running = true;

            // Raise event
            Raise(EventType.Started);

            // Link enumerator
            var linkEnum = ((IEnumerable <Link>)LinksByEndPoint).GetEnumerator();

            // Loop
            while (Running)
            {
                // INLET
                Inlet(Socket);

                // Processing timeouts
                if (linkEnum.MoveNext())
                {
                    var link = linkEnum.Current;
                    link.Timeout();

                    // If it is closed
                    if (link.Closed)
                    {
                        LinksByEndPoint.Remove(link);

                        // Statistics
                        Statistics.DecreaseLink();
                    }

                    // Update traffic
                    link.Statistics.UpdateTraffic();
                }

                else
                {
                    linkEnum.Reset();

                    // Update traffic
                    Statistics.UpdateTraffic();
                }

                // Internal call events
                if (!Settings.UseEvents)
                {
                    Event();
                }
            }


            // Disconnect all
            foreach (Link link in LinksByEndPoint)
            {
                link.Shuting();
            }


            // Wait for disconections
            while (!LinksByEndPoint.IsEmpty)
            {
                // Processing timeouts
                if (linkEnum.MoveNext())
                {
                    var link = linkEnum.Current;
                    link.Timeout();

                    // If it is closed
                    if (link.Closed)
                    {
                        LinksByEndPoint.Remove(link);

                        // Statistics
                        Statistics.DecreaseLink();
                    }

                    // Update trafic
                    link.Statistics.UpdateTraffic();
                }
                else
                {
                    linkEnum.Reset();

                    // Update traffic
                    Statistics.UpdateTraffic();
                }

                // Internal call events
                if (!Settings.UseEvents)
                {
                    Event();
                }
            }

            // Clear links
            LinksByEndPoint.Clear();

            // Raise event
            Raise(EventType.Stopped);

            // Internal call events
            if (!Settings.UseEvents)
            {
                Event();
            }
        }