예제 #1
0
 ///
 public bool TryUnregister(TcpListenerConnection listener)
 {
     lock (_listeners)
     {
         return(RemoveListener(listener));
     }
 }
예제 #2
0
        /// <summary>
        /// Register for a specific port
        /// </summary>
        public void Register(TcpListenerConnection listener)
        {
            // First check if port was taken
            var port        = listener.Port;
            var address     = listener.Address;
            var interpreter = listener.Validator.Interpreter;

            if (!PortMap.Register(address, port, interpreter))
            {
                throw new InvalidOperationException($"Attempted to register protocol header {interpreter} on port {port}, but port was already taken");
            }

            // Get port listeners
            TcpPortListener portListener;

            lock (_listeners)
            {
                portListener = FindListener(listener);
                if (portListener == null)
                {
                    portListener = new TcpPortListener(address, port);
                    _listeners.Add(portListener);
                }
            }

            portListener.Register(listener);
        }
예제 #3
0
        /// <summary>
        /// Unregister the connection
        /// </summary>
        /// <param name="listener"></param>
        public void Unregister(TcpListenerConnection listener)
        {
            TcpPortListener target;

            lock (_listeners)
            {
                target = FindListener(listener);
            }
            target.TryUnregister(listener);
        }
예제 #4
0
        /// <summary>
        /// Unregister the connection
        /// </summary>
        /// <param name="listener"></param>
        public void Unregister(TcpListenerConnection listener)
        {
            TcpPortListener target;

            lock (_listeners)
            {
                target = _listeners.First(l => l.Port == listener.Port);
            }
            target.TryUnregister(listener);
        }
예제 #5
0
        private bool RemoveListener(TcpListenerConnection listener)
        {
            var found = _listeners.Remove(listener);

            if (found && _listeners.Count == 0)
            {
                _listening = false;
                _tcpListener.Stop();
            }
            return(found);
        }
예제 #6
0
        ///
        public void Register(TcpListenerConnection listener)
        {
            lock (_listeners)
            {
                // Steal objects from the first listener
                if (_protocolInterpreter == null)
                {
                    _protocolInterpreter = listener.Validator.Interpreter;
                }
                if (_logger == null)
                {
                    _logger = listener.Logger.GetChild(string.Empty, typeof(TcpPortListener));
                }

                _listeners.Add(listener);

                StartListening();
            }
        }
예제 #7
0
 private TcpPortListener FindListener(TcpListenerConnection listener)
 {
     return(_listeners.FirstOrDefault(l => l.Address.Equals(listener.Address) && l.Port == listener.Port));
 }
예제 #8
0
 public ServerConnectedState(TcpListenerConnection context, StateMap stateMap) : base(context, stateMap, BinaryConnectionState.Connected)
 {
 }