public void Dispose()
 {
     if (DiscoveredNodeGroup != null)
     {
         DiscoveredNodeGroup.Dispose();
     }
     if (ConnectNodeGroup != null)
     {
         ConnectNodeGroup.Dispose();
     }
     if (AddNodeNodeGroup != null)
     {
         AddNodeNodeGroup.Dispose();
     }
     foreach (var server in _Servers)
     {
         server.Dispose();
     }
     foreach (var node in ConnectedNodes.Where(n => n.Behaviors.Find <ConnectionManagerBehavior>().OneTry))
     {
         node.Disconnect();
     }
 }
        public void Start()
        {
            _Parameters.UserAgent = "StratisBitcoin:" + GetVersion();
            if (_ConnectionManagerSettings.Connect.Count == 0)
            {
                var cloneParameters = _Parameters.Clone();
                cloneParameters.TemplateBehaviors.Add(new ConnectionManagerBehavior(false, this));
                DiscoveredNodeGroup = CreateNodeGroup(cloneParameters, _DiscoveredNodeRequiredService);
                DiscoveredNodeGroup.CustomGroupSelector = WellKnownGroupSelectors.ByNetwork;                 //is the default, but I want to use it
                DiscoveredNodeGroup.Connect();
            }
            else
            {
                var cloneParameters = _Parameters.Clone();
                cloneParameters.TemplateBehaviors.Add(new ConnectionManagerBehavior(false, this));
                cloneParameters.TemplateBehaviors.Remove <AddressManagerBehavior>();
                var addrman = new AddressManager();
                addrman.Add(_ConnectionManagerSettings.Connect.Select(c => new NetworkAddress(c)).ToArray(), IPAddress.Loopback);
                var addrmanBehavior = new AddressManagerBehavior(addrman);
                addrmanBehavior.Mode = AddressManagerBehaviorMode.None;
                cloneParameters.TemplateBehaviors.Add(addrmanBehavior);

                ConnectNodeGroup = CreateNodeGroup(cloneParameters, NodeServices.Nothing);
                ConnectNodeGroup.MaximumNodeConnection = _ConnectionManagerSettings.Connect.Count;
                ConnectNodeGroup.CustomGroupSelector   = WellKnownGroupSelectors.ByEndpoint;
                ConnectNodeGroup.Connect();
            }

            {
                var cloneParameters = _Parameters.Clone();
                cloneParameters.TemplateBehaviors.Add(new ConnectionManagerBehavior(false, this));
                cloneParameters.TemplateBehaviors.Remove <AddressManagerBehavior>();
                var addrman = new AddressManager();
                addrman.Add(_ConnectionManagerSettings.AddNode.Select(c => new NetworkAddress(c)).ToArray(), IPAddress.Loopback);
                var addrmanBehavior = new AddressManagerBehavior(addrman);
                addrmanBehavior.Mode = AddressManagerBehaviorMode.AdvertizeDiscover;
                cloneParameters.TemplateBehaviors.Add(addrmanBehavior);

                AddNodeNodeGroup = CreateNodeGroup(cloneParameters, NodeServices.Nothing);
                AddNodeNodeGroup.MaximumNodeConnection = _ConnectionManagerSettings.AddNode.Count;
                AddNodeNodeGroup.CustomGroupSelector   = WellKnownGroupSelectors.ByEndpoint;
                AddNodeNodeGroup.Connect();
            }

            StringBuilder logs = new StringBuilder();

            logs.AppendLine("Node listening on:");
            foreach (var listen in _ConnectionManagerSettings.Listen)
            {
                var cloneParameters = _Parameters.Clone();
                var server          = new NodeServer(Network);
                server.LocalEndpoint    = listen.Endpoint;
                server.ExternalEndpoint = _ConnectionManagerSettings.ExternalEndpoint;
                _Servers.Add(server);
                cloneParameters.TemplateBehaviors.Add(new ConnectionManagerBehavior(true, this)
                {
                    Whitelisted = listen.Whitelisted
                });
                server.InboundNodeConnectionParameters = cloneParameters;
                server.Listen();
                logs.Append(listen.Endpoint.Address + ":" + listen.Endpoint.Port);
                if (listen.Whitelisted)
                {
                    logs.Append(" (whitelisted)");
                }
                logs.AppendLine();
            }
            Logs.ConnectionManager.LogInformation(logs.ToString());
        }