SystemMulticastIPAddressInformation.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Net / System / Net / NetworkInformation / SystemMulticastIPAddressInformation.cs / 1 / SystemMulticastIPAddressInformation.cs

                             
    /// 
    ///    Provides support for ip configuation information and statistics.
    ///
    /// 
namespace System.Net.NetworkInformation {
 
    using System.Net; 
    using System.Net.Sockets;
    using System; 
    using System.Runtime.InteropServices;
    using System.Collections;
    using System.ComponentModel;
    using System.Security.Permissions; 
    using Microsoft.Win32;
 
 

    ///  
    /// Specifies the Multicast addresses for an interface.
    /// OS < XP
    /// 
    ///  
    internal class SystemMulticastIPAddressInformation:MulticastIPAddressInformation {
        private IpAdapterAddress adapterAddress; 
        private SystemIPAddressInformation innerInfo; 

        private SystemMulticastIPAddressInformation() { 
        }


        /* 
        // Consider removing.
        internal SystemMulticastIPAddressInformation(IpAdapterInfo ipAdapterInfo, IPAddress address){ 
            innerInfo = new SystemIPAddressInformation(address); 
            DateTime tempdate = new DateTime(1970,1,1);
            tempdate = tempdate.AddSeconds(ipAdapterInfo.leaseExpires); 
            dhcpLeaseLifetime = (long)((tempdate - DateTime.UtcNow).TotalSeconds);
        }
        */
 
        internal SystemMulticastIPAddressInformation(IpAdapterAddress adapterAddress, IPAddress ipAddress){
            innerInfo = new SystemIPAddressInformation(adapterAddress,ipAddress); 
            this.adapterAddress = adapterAddress; 
        }
 
       /// 
        public override IPAddress Address{get {return innerInfo.Address;}}

        ///  
        /// The address is a cluster address and shouldn't be used by most applications.
        public override bool IsTransient{ 
            get { 
                return (innerInfo.IsTransient);
            } 
        }

        /// 
        /// This address can be used for DNS. 
        public override bool IsDnsEligible{
            get { 
                return (innerInfo.IsDnsEligible); 
            }
        } 


        /// 
        public override PrefixOrigin PrefixOrigin{ 
            get {
                if (! ComNetOS.IsPostWin2K) 
                    throw new PlatformNotSupportedException(SR.GetString(SR.WinXPRequired)); 

                return PrefixOrigin.Other; 
            }
        }

        ///  
        public override SuffixOrigin SuffixOrigin{
            get { 
                if (! ComNetOS.IsPostWin2K) 
                    throw new PlatformNotSupportedException(SR.GetString(SR.WinXPRequired));
 
                return SuffixOrigin.Other;
            }
        }
        ///  
        /// IPv6 only.  Specifies the duplicate address detection state. Only supported
        /// for IPv6. If called on an IPv4 address, will throw a "not supported" exception. 
        public override DuplicateAddressDetectionState DuplicateAddressDetectionState{ 
            get {
                if (! ComNetOS.IsPostWin2K) 
                    throw new PlatformNotSupportedException(SR.GetString(SR.WinXPRequired));

                return DuplicateAddressDetectionState.Invalid;
            } 
        }
 
 
        /// 
        /// Specifies the valid lifetime of the address in seconds. 
        public override long AddressValidLifetime{
            get {
                if (! ComNetOS.IsPostWin2K)
                    throw new PlatformNotSupportedException(SR.GetString(SR.WinXPRequired)); 

                return 0; 
                } 
            }
        ///  
        /// Specifies the prefered lifetime of the address in seconds.

        public override long AddressPreferredLifetime{
            get { 
                if (! ComNetOS.IsPostWin2K)
                    throw new PlatformNotSupportedException(SR.GetString(SR.WinXPRequired)); 
 
                return 0;
                } 
            }
        /// 

        ///  
        /// Specifies the prefered lifetime of the address in seconds.
        public override long DhcpLeaseLifetime{ 
            get { 
                return 0;
                } 
            }


        //helper method that marshals the addressinformation into the classes 
        internal static MulticastIPAddressInformationCollection ToAddressInformationCollection(IntPtr ptr) {
 
            //we don't know the number of addresses up front, so we create an arraylist 
            //to temporarily store them.
            MulticastIPAddressInformationCollection addressList = new MulticastIPAddressInformationCollection(); 

            //if there is no address, just return;
            if (ptr == IntPtr.Zero)
                return addressList; 

            //get the first address 
            IpAdapterAddress addr = (IpAdapterAddress)Marshal.PtrToStructure(ptr,typeof(IpAdapterAddress)); 

 
            //determine the address family used to create the IPAddress
            AddressFamily family = (addr.address.addressLength > 16)?AddressFamily.InterNetworkV6:AddressFamily.InterNetwork;
            SocketAddress sockAddress = new SocketAddress(family,(int)addr.address.addressLength);
            Marshal.Copy(addr.address.address,sockAddress.m_Buffer,0,addr.address.addressLength); 

 
            //unfortunately, the only way to currently create an ipaddress is through IPEndPoint 
            IPEndPoint ep;
 
            if (family == AddressFamily.InterNetwork )
              ep = (IPEndPoint)IPEndPoint.Any.Create(sockAddress);
            else
              ep = (IPEndPoint)IPEndPoint.IPv6Any.Create(sockAddress); 

 
            //add the ipaddress to the arraylist 
            addressList.InternalAdd(new SystemMulticastIPAddressInformation(addr,ep.Address));
 
            //repeat for all of the addresses
            while ( addr.next != IntPtr.Zero ) {
                addr = (IpAdapterAddress)Marshal.PtrToStructure(addr.next,typeof(IpAdapterAddress));
 
                //determine the address family used to create the IPAddress
                family = (addr.address.addressLength > 16)?AddressFamily.InterNetworkV6:AddressFamily.InterNetwork; 
                sockAddress = new SocketAddress(family,(int)addr.address.addressLength); 
                Marshal.Copy(addr.address.address,sockAddress.m_Buffer,0,addr.address.addressLength);
 
                //use the endpoint to create the ipaddress
                if (family == AddressFamily.InterNetwork )
                  ep = (IPEndPoint)IPEndPoint.Any.Create(sockAddress);
                else 
                  ep = (IPEndPoint)IPEndPoint.IPv6Any.Create(sockAddress);
 
                addressList.InternalAdd(new SystemMulticastIPAddressInformation(addr,ep.Address)); 
            }
 
            return addressList;
        }
    }
} 



                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK