예제 #1
0
파일: Lookup.cs 프로젝트: mreinart/ice
 internal Lookup(LocatorRegistry registryServant, Communicator communicator)
 {
     _registryServant = registryServant;
     _domainId        = communicator.GetProperty("Ice.Discovery.DomainId") ?? "";
 }
예제 #2
0
 internal Lookup(LocatorRegistry registryServant, string pluginName, Communicator communicator)
 {
     _pluginName      = pluginName;
     _registryServant = registryServant;
     _domainId        = communicator.GetProperty($"{_pluginName}.DomainId") ?? "";
 }
예제 #3
0
        public void Initialize(PluginInitializationContext context)
        {
            const string defaultIPv4Endpoint = "udp -h 239.255.0.1 -p 4061";
            const string defaultIPv6Endpoint = "udp -h \"ff15::1\" -p 4061";

            if (_communicator.GetProperty($"{_pluginName}.Multicast.Endpoints") == null)
            {
                _communicator.SetProperty($"{_pluginName}.Multicast.Endpoints",
                                          $"{defaultIPv4Endpoint}:{defaultIPv6Endpoint}");
            }

            string?lookupEndpoints = _communicator.GetProperty($"{_pluginName}.Lookup");

            if (lookupEndpoints == null)
            {
                List <string> endpoints      = new ();
                List <string> ipv4Interfaces = Network.GetInterfacesForMulticast("0.0.0.0", Network.EnableIPv4);
                List <string> ipv6Interfaces = Network.GetInterfacesForMulticast("::0", Network.EnableIPv6);

                endpoints.AddRange(ipv4Interfaces.Select(i => $"{defaultIPv4Endpoint} --interface \"{i}\""));
                endpoints.AddRange(ipv6Interfaces.Select(i => $"{defaultIPv6Endpoint} --interface \"{i}\""));

                lookupEndpoints = string.Join(":", endpoints);
            }

            if (_communicator.GetProperty($"{_pluginName}.Reply.Endpoints") == null)
            {
                _communicator.SetProperty($"{_pluginName}.Reply.Endpoints", "udp -h \"::0\" -p 0");
            }
            _communicator.SetProperty($"{_pluginName}.Reply.ProxyOptions", "-d"); // create datagram proxies

            if (_communicator.GetProperty($"{_pluginName}.Locator.Endpoints") == null)
            {
                _communicator.SetProperty($"{_pluginName}.Locator.AdapterId", Guid.NewGuid().ToString());
            }

            _multicastAdapter = _communicator.CreateObjectAdapter($"{_pluginName}.Multicast");
            _replyAdapter     = _communicator.CreateObjectAdapter($"{_pluginName}.Reply");
            _locatorAdapter   = _communicator.CreateObjectAdapter($"{_pluginName}.Locator");

            // Setup locator registry.
            var locatorRegistryServant          = new LocatorRegistry(_communicator);
            ILocatorRegistryPrx locatorRegistry =
                _locatorAdapter.AddWithUUID(locatorRegistryServant, ILocatorRegistryPrx.Factory);

            ILookupPrx lookup =
                ILookupPrx.Parse($"IceDiscovery/Lookup -d:{lookupEndpoints}", _communicator).Clone(clearRouter: true);

            // Add lookup Ice object
            var lookupServant = new Lookup(locatorRegistryServant, _pluginName, _communicator);

            _multicastAdapter.Add("IceDiscovery/Lookup", lookupServant);

            // Setup locator on the communicator.
            _locator = _locatorAdapter.AddWithUUID(new Locator(locatorRegistry, lookup, _replyAdapter, _pluginName),
                                                   ILocatorPrx.Factory);

            _defaultLocator = _communicator.DefaultLocator;
            _communicator.DefaultLocator = _locator;

            _multicastAdapter.Activate();
            _replyAdapter.Activate();
            _locatorAdapter.Activate();
        }