/// <summary> /// Creates a new instance of the <see cref="ServiceProfile"/> class /// with the specified details. /// </summary> /// <param name="instanceName"> /// A unique identifier for the specific service instance. /// </param> /// <param name="serviceName"> /// The <see cref="ServiceName">name</see> of the service. /// </param> /// <param name="port"> /// The TCP/UDP port of the service. /// </param> /// <param name="addresses"> /// The IP addresses of the specific service instance. If <b>null</b> then /// <see cref="MulticastService.GetIpAddresses"/> is used. /// </param> /// <remarks> /// The SRV, TXT and A/AAAA resoruce records are added to the <see cref="Resources"/>. /// </remarks> public ServiceProfile(DomainName instanceName, DomainName serviceName, ushort port, IEnumerable <IPAddress> addresses = null) { InstanceName = instanceName; ServiceName = serviceName; var fqn = FullyQualifiedName; var simpleServiceName = new DomainName(ServiceName.ToString() .Replace("._tcp", "") .Replace("._udp", "") .Trim('_') .Replace("_", "-")); HostName = DomainName.Join(InstanceName, serviceName, Domain); Resources.Add(new SRVRecord { Name = fqn, Port = port, Target = HostName }); foreach (var address in addresses ?? MulticastService.GetLinkLocalAddresses()) { Resources.Add(AddressRecord.Create(HostName, address)); } }
/// <summary> /// Sends an unsolicited MDNS response describing the /// service profile. /// </summary> /// <param name="profile"> /// The profile to describe. /// </param> /// <remarks> /// Sends a MDNS response <see cref="Message"/> containing the pointer /// and resource records of the <paramref name="profile"/>. /// <para> /// To provide increased robustness against packet loss, /// two unsolicited responses are sent one second apart. /// </para> /// </remarks> public void Announce(ServiceProfile profile) { var message = new Message { QR = true }; // Add the shared records. var ptrRecord = new PTRRecord { Name = profile.QualifiedServiceName, DomainName = profile.FullyQualifiedName }; message.Answers.Add(ptrRecord); // Add the resource records. profile.Resources.ForEach((resource) => { message.Answers.Add(resource); }); message.Questions.Add(new Question() { Name = profile.ServiceName, Class = DnsClass.IN, Type = DnsType.PTR }); foreach (var ip in MulticastService.GetLinkLocalAddresses()) { message.AdditionalRecords.Add(new ARecord() { Class = DnsClass.IN, Type = DnsType.A, Name = profile.ServiceName, Address = ip, TTL = TimeSpan.FromSeconds(120) }); } Mdns.Send(message, false); Task.Delay(1000).Wait(); Mdns.Send(message, false); }