internal MulticastIPAddressInformation(IP_ADAPTER_MULTICAST_ADDRESS multicastAddress) { this.iama = multicastAddress; address = GetAddressFromSocketAddress(iama.Address.lpSockaddr); isDnsEligible = iama.Flags.HasFlag(IP_ADAPTER_ADDRESS.DNS_ELIGIBLE); isTransient = iama.Flags.HasFlag(IP_ADAPTER_ADDRESS.TRANSIENT); }
/// <summary> /// Returns an object that describes the configuration of this network interface. /// </summary> /// <returns>An <see cref="IPInterfaceProperties"/> object that describes this network interface.</returns> /// <remarks>Note that the information in the object returned by this method reflects the interfaces as of the time the array is created. /// This information is not updated dynamically. /// <list type="table"><listheader><term>Platforms Supported</term><description></description></listheader> /// <item><term>Windows Mobile</term><description>Windows Mobile Version 5.0 and later</description></item> /// <item><term>Windows Embedded Compact</term><description>Windows CE .NET 4.1 and later</description></item> /// </list></remarks> public IPInterfaceProperties GetIPProperties() { IPInterfaceProperties ipp = null; IntPtr buffer = IntPtr.Zero; int bufferlen = 0; int result = NativeMethods.GetAdaptersAddresses(0, (GAA_FLAG)0, IntPtr.Zero, buffer, ref bufferlen); buffer = Marshal.AllocHGlobal(bufferlen); try { result = NativeMethods.GetAdaptersAddresses(0, (GAA_FLAG)0, IntPtr.Zero, buffer, ref bufferlen); if (result == 0) { IP_ADAPTER_ADDRESSES ipaa = (IP_ADAPTER_ADDRESSES)Marshal.PtrToStructure(buffer, typeof(IP_ADAPTER_ADDRESSES)); while ((ipaa.IfIndex != this.row.dwIndex) && (ipaa.Next != IntPtr.Zero)) { ipaa = (IP_ADAPTER_ADDRESSES)Marshal.PtrToStructure(ipaa.Next, typeof(IP_ADAPTER_ADDRESSES)); } if (ipaa.IfIndex != this.row.dwIndex) { return(null); } ipp = new IPInterfaceProperties(ipaa); if (ipaa.FirstAnycastAddress != IntPtr.Zero) { IP_ADAPTER_ANYCAST_ADDRESS aa = (IP_ADAPTER_ANYCAST_ADDRESS)Marshal.PtrToStructure(ipaa.FirstAnycastAddress, typeof(IP_ADAPTER_ANYCAST_ADDRESS)); ipp.AnycastAddresses.InternalAdd(new IPAddressInformation(aa)); while (aa.Next != IntPtr.Zero) { aa = (IP_ADAPTER_ANYCAST_ADDRESS)Marshal.PtrToStructure(aa.Next, typeof(IP_ADAPTER_ANYCAST_ADDRESS)); ipp.AnycastAddresses.InternalAdd(new IPAddressInformation(aa)); } } if (ipaa.FirstMulticastAddress != IntPtr.Zero) { IP_ADAPTER_MULTICAST_ADDRESS ma = (IP_ADAPTER_MULTICAST_ADDRESS)Marshal.PtrToStructure(ipaa.FirstMulticastAddress, typeof(IP_ADAPTER_MULTICAST_ADDRESS)); ipp.MulticastAddresses.InternalAdd(new MulticastIPAddressInformation(ma)); while (ma.Next != IntPtr.Zero) { ma = (IP_ADAPTER_MULTICAST_ADDRESS)Marshal.PtrToStructure(ma.Next, typeof(IP_ADAPTER_MULTICAST_ADDRESS)); ipp.MulticastAddresses.InternalAdd(new MulticastIPAddressInformation(ma)); } } if (ipaa.FirstUnicastAddress != IntPtr.Zero) { IP_ADAPTER_UNICAST_ADDRESS ua = (IP_ADAPTER_UNICAST_ADDRESS)Marshal.PtrToStructure(ipaa.FirstUnicastAddress, typeof(IP_ADAPTER_UNICAST_ADDRESS)); ipp.UnicastAddresses.InternalAdd(new UnicastIPAddressInformation(ua)); while (ua.Next != IntPtr.Zero) { ua = (IP_ADAPTER_UNICAST_ADDRESS)Marshal.PtrToStructure(ua.Next, typeof(IP_ADAPTER_UNICAST_ADDRESS)); ipp.UnicastAddresses.InternalAdd(new UnicastIPAddressInformation(ua)); } } if (ipaa.FirstDnsServerAddress != IntPtr.Zero) { IP_ADAPTER_DNS_SERVER_ADDRESS da = (IP_ADAPTER_DNS_SERVER_ADDRESS)Marshal.PtrToStructure(ipaa.FirstDnsServerAddress, typeof(IP_ADAPTER_DNS_SERVER_ADDRESS)); ipp.DnsAddresses.InternalAdd(IPAddressInformation.GetAddressFromSocketAddress(da.Address.lpSockaddr)); while (da.Next != IntPtr.Zero) { da = (IP_ADAPTER_DNS_SERVER_ADDRESS)Marshal.PtrToStructure(ipaa.FirstDnsServerAddress, typeof(IP_ADAPTER_DNS_SERVER_ADDRESS)); ipp.DnsAddresses.InternalAdd(IPAddressInformation.GetAddressFromSocketAddress(da.Address.lpSockaddr)); } } } } finally { Marshal.FreeHGlobal(buffer); } return(ipp); }