File: System\ServiceModel\Discovery\UdpDiscoveryEndpoint.cs
Project: ndp\cdf\src\NetFx40\System.ServiceModel.Discovery\System.ServiceModel.Discovery.csproj (System.ServiceModel.Discovery)
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
namespace System.ServiceModel.Discovery
{
    using System.Diagnostics.CodeAnalysis;
    using System.Runtime;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Description;
    using System.Net.Sockets;
 
    [Fx.Tag.XamlVisible(false)]
    public class UdpDiscoveryEndpoint : DiscoveryEndpoint
    {
        [SuppressMessage(FxCop.Category.Security, FxCop.Rule.DoNotDeclareReadOnlyMutableReferenceTypes)]
        [SuppressMessage(FxCop.Category.Naming, "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Pv", Justification = "IPv4 is valid.")]
        public static readonly Uri DefaultIPv4MulticastAddress = DiscoveryDefaults.Udp.IPv4MulticastAddress;
 
        [SuppressMessage(FxCop.Category.Security, FxCop.Rule.DoNotDeclareReadOnlyMutableReferenceTypes)]
        [SuppressMessage(FxCop.Category.Naming, "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Pv", Justification = "IPv6 is valid.")]
        public static readonly Uri DefaultIPv6MulticastAddress = DiscoveryDefaults.Udp.IPv6MulticastAddress;
 
        DiscoveryViaBehavior viaBehavior;
        UdpTransportSettings udpTransportSettings;
 
        public UdpDiscoveryEndpoint()
            : this(GetDefaultMulticastAddress())
        {
        }
 
        public UdpDiscoveryEndpoint(string multicastAddress)
            : this(new Uri(multicastAddress))
        {
        }
 
        public UdpDiscoveryEndpoint(Uri multicastAddress)
            : this(DiscoveryVersion.DefaultDiscoveryVersion, multicastAddress)
        {
        }
 
        public UdpDiscoveryEndpoint(DiscoveryVersion discoveryVersion)
            : this(discoveryVersion, GetDefaultMulticastAddress())
        {
        }
 
        public UdpDiscoveryEndpoint(DiscoveryVersion discoveryVersion, string multicastAddress)
            : this(discoveryVersion, new Uri(multicastAddress))
        {
        }
 
        public UdpDiscoveryEndpoint(DiscoveryVersion discoveryVersion, Uri multicastAddress)
            : base(discoveryVersion, ServiceDiscoveryMode.Adhoc)
        {
            if (multicastAddress == null)
            {
                throw FxTrace.Exception.ArgumentNull("multicastAddress");
            }
            if (discoveryVersion == null)
            {
                throw FxTrace.Exception.ArgumentNull("discoveryVersion");
            }
 
            // Send replies async to maintain performance
            base.Behaviors.Add(new DispatcherSynchronizationBehavior { AsynchronousSendEnabled = true });
 
            Initialize(multicastAddress);
        }
 
        public Uri MulticastAddress
        {
            get
            {
                return this.viaBehavior.Via;
            }
            set
            {
                if (value == null)
                {
                    throw FxTrace.Exception.ArgumentNull("value");
                }
 
                this.viaBehavior.Via = value;
                base.ListenUri = value;
            }
        }
 
        [Obsolete("TranportSettings property in System.SerivceModel.Discovery.UdpDiscoveryEndpoint is obsolete. Consider using System.ServiceModel.Channels.UdpTransportBindingElement for setting the transport properties.")]
        public UdpTransportSettings TransportSettings
        {
            get
            {
                return this.udpTransportSettings;
            }
        }
 
        void Initialize(Uri multicastAddress)
        {
            this.viaBehavior = new DiscoveryViaBehavior(multicastAddress);
            base.ListenUri = multicastAddress;
 
            TextMessageEncodingBindingElement textBE = new TextMessageEncodingBindingElement();
            textBE.MessageVersion = base.DiscoveryVersion.Implementation.MessageVersion;
 
            UdpTransportBindingElement udpBE = DiscoveryDefaults.Udp.CreateUdpTransportBindingElement();
            this.udpTransportSettings = new UdpTransportSettings(udpBE);
 
            CustomBinding binding = new CustomBinding();
            binding.Elements.Add(textBE);
            binding.Elements.Add(udpBE);
 
            base.MaxResponseDelay = DiscoveryDefaults.Udp.AppMaxDelay;
            base.Address = new EndpointAddress(base.DiscoveryVersion.Implementation.DiscoveryAddress);
            base.Binding = binding;
            base.Behaviors.Add(this.viaBehavior);
            base.Behaviors.Add(new UdpReplyToBehavior(udpBE.Scheme));
            base.Behaviors.Add(new UdpContractFilterBehavior());
        }
 
        static Uri GetDefaultMulticastAddress()
        {
            return Socket.OSSupportsIPv4 ? DefaultIPv4MulticastAddress : DefaultIPv6MulticastAddress;
        }
    }
}