public void Advertises_ServiceInstance_Address() { var service = new ServiceProfile("x2", "_sdtest-1._udp", 1024, new[] { IPAddress.Loopback }); var done = new ManualResetEvent(false); var mdns = new MulticastService(); mdns.NetworkInterfaceDiscovered += (s, e) => mdns.SendQuery(service.HostName, DnsClass.IN, DnsType.A); mdns.AnswerReceived += (s, e) => { var msg = e.Message; if (msg.Answers.OfType <ARecord>().Any(p => p.Name == service.HostName)) { done.Set(); } }; try { using (var sd = new ServiceDiscovery(mdns)) { sd.Advertise(service); mdns.Start(); Assert.IsTrue(done.WaitOne(TimeSpan.FromSeconds(1)), "query timeout"); } } finally { mdns.Stop(); } }
public void Discover_AllServices() { var service = new ServiceProfile("x", "_sdtest-2._udp", 1024); var done = new ManualResetEvent(false); var mdns = new MulticastService(); var sd = new ServiceDiscovery(mdns); mdns.NetworkInterfaceDiscovered += (s, e) => sd.QueryAllServices(); sd.ServiceDiscovered += (s, serviceName) => { if (serviceName == service.QualifiedServiceName) { done.Set(); } }; try { sd.Advertise(service); mdns.Start(); Assert.IsTrue(done.WaitOne(TimeSpan.FromSeconds(1)), "DNS-SD query timeout"); } finally { sd.Dispose(); mdns.Stop(); } }
public void Discover_ServiceInstance() { var service = new ServiceProfile("y", "_sdtest-2._udp", 1024); var done = new ManualResetEvent(false); var mdns = new MulticastService(); var sd = new ServiceDiscovery(mdns); mdns.NetworkInterfaceDiscovered += (s, e) => { sd.QueryServiceInstances(service.ServiceName); }; sd.ServiceInstanceDiscovered += (s, e) => { if (e.ServiceInstanceName == service.FullyQualifiedName) { Assert.IsNotNull(e.Message); done.Set(); } }; try { sd.Advertise(service); mdns.Start(); Assert.IsTrue(done.WaitOne(TimeSpan.FromSeconds(1)), "instance not found"); } finally { sd.Dispose(); mdns.Stop(); } }
public void Unadvertise() { var service = new ServiceProfile("z", "_sdtest-7._udp", 1024); var done = new ManualResetEvent(false); var mdns = new MulticastService(); var sd = new ServiceDiscovery(mdns); mdns.NetworkInterfaceDiscovered += (s, e) => sd.QueryAllServices(); sd.ServiceInstanceShutdown += (s, e) => { if (e.ServiceInstanceName == service.FullyQualifiedName) { done.Set(); } }; try { sd.Advertise(service); mdns.Start(); sd.Unadvertise(service); Assert.IsTrue(done.WaitOne(TimeSpan.FromSeconds(1)), "goodbye timeout"); } finally { sd.Dispose(); mdns.Stop(); } }
public void Discover_ServiceInstance_WithAnswersContainingAdditionRecords() { var service = new ServiceProfile("y", "_sdtest-2._udp", 1024, new[] { IPAddress.Parse("127.1.1.1") }); var done = new ManualResetEvent(false); using (var mdns = new MulticastService()) using (var sd = new ServiceDiscovery(mdns) { AnswersContainsAdditionalRecords = true }) { Message discovered = null; mdns.NetworkInterfaceDiscovered += (s, e) => { sd.QueryServiceInstances(service.ServiceName); }; sd.ServiceInstanceDiscovered += (s, e) => { if (e.ServiceInstanceName == service.FullyQualifiedName) { Assert.IsNotNull(e.Message); discovered = e.Message; done.Set(); } }; sd.Advertise(service); mdns.Start(); Assert.IsTrue(done.WaitOne(TimeSpan.FromSeconds(3)), "instance not found"); var additionalRecordsCount = 1 + // SRVRecord 1 + // TXTRecord 1; // AddressRecord var answersCount = additionalRecordsCount + 1; // PTRRecord Assert.AreEqual(0, discovered.AdditionalRecords.Count); Assert.AreEqual(answersCount, discovered.Answers.Count); } }
public void ResourceRecords() { var profile = new ServiceProfile("me", "_myservice._udp", 1234, new IPAddress[] { IPAddress.Loopback }); profile.Subtypes.Add("apiv2"); profile.AddProperty("someprop", "somevalue"); using (var sd = new ServiceDiscovery()) { sd.Advertise(profile); var resourceRecords = sd.NameServer.Catalog.Values.SelectMany(node => node.Resources); foreach (var r in resourceRecords) { Console.WriteLine(r.ToString()); } } }
public void ReverseAddressMapping() { var service = new ServiceProfile("x9", "_sdtest-1._udp", 1024, new[] { IPAddress.Loopback, IPAddress.IPv6Loopback }); var arpaAddress = IPAddress.Loopback.GetArpaName(); var done = new ManualResetEvent(false); var mdns = new MulticastService(); Message response = null; mdns.NetworkInterfaceDiscovered += (s, e) => mdns.SendQuery(arpaAddress, DnsClass.IN, DnsType.PTR); mdns.AnswerReceived += (s, e) => { var msg = e.Message; if (msg.Answers.OfType <PTRRecord>().Any(p => p.Name == arpaAddress)) { response = msg; done.Set(); } }; try { using (var sd = new ServiceDiscovery(mdns)) { sd.Advertise(service); mdns.Start(); Assert.IsTrue(done.WaitOne(TimeSpan.FromSeconds(1)), "query timeout"); var answers = response.Answers .OfType <PTRRecord>() .Where(ptr => service.HostName == ptr.DomainName); foreach (var answer in answers) { Assert.AreEqual(arpaAddress, answer.Name); Assert.IsTrue(answer.TTL > TimeSpan.Zero); Assert.AreEqual(DnsClass.IN, answer.Class); } } } finally { mdns.Stop(); } }
public void Discover_ServiceInstance_WithAnswersContainingAdditionRecords() { var service = new ServiceProfile("y", "_sdtest-2._udp", 1024); var done = new ManualResetEvent(false); var mdns = new MulticastService(); var sd = new ServiceDiscovery(mdns) { AnswersContainsAdditionalRecords = true }; Message discovered = null; mdns.NetworkInterfaceDiscovered += (s, e) => { sd.QueryServiceInstances(service.ServiceName); }; sd.ServiceInstanceDiscovered += (s, e) => { if (e.ServiceInstanceName == service.FullyQualifiedName) { Assert.IsNotNull(e.Message); discovered = e.Message; done.Set(); } }; try { sd.Advertise(service); mdns.Start(); Assert.IsTrue(done.WaitOne(TimeSpan.FromSeconds(1)), "instance not found"); Assert.AreEqual(0, discovered.AdditionalRecords.Count); Assert.IsTrue(discovered.Answers.Count > 1); } finally { sd.Dispose(); mdns.Stop(); } }