Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Net / System / Net / NetworkInformation / SystemIPAddressInformation.cs / 1 / SystemIPAddressInformation.cs
////// 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; //this is the main addressinformation class that contains the ipaddress //and other properties internal class SystemIPAddressInformation:IPAddressInformation{ IPAddress address; internal bool transient = false; internal bool dnsEligible = true; /* // Consider removing. internal SystemIPAddressInformation(){} */ internal SystemIPAddressInformation(IPAddress address) { this.address = address; if (address.AddressFamily == AddressFamily.InterNetwork) { //DngEligible is true except for 169.254.x.x addresses (the APIPA addresses ) dnsEligible = !((address.m_Address & 0x0000FEA9)>0); } } internal SystemIPAddressInformation(IpAdapterUnicastAddress adapterAddress,IPAddress address) { this.address = address; transient = (adapterAddress.flags & AdapterAddressFlags.Transient)>0; dnsEligible = (adapterAddress.flags & AdapterAddressFlags.DnsEligible)>0; } internal SystemIPAddressInformation(IpAdapterAddress adapterAddress,IPAddress address) { this.address = address; transient = (adapterAddress.flags & AdapterAddressFlags.Transient)>0; dnsEligible = (adapterAddress.flags & AdapterAddressFlags.DnsEligible)>0; } public override IPAddress Address{get {return address;}} /// /// Provides support for ip configuation information and statistics. /// The address is a cluster address and shouldn't be used by most applications. public override bool IsTransient{ get { return (transient); } } ///This address can be used for DNS. public override bool IsDnsEligible{ get { return (dnsEligible); } } //helper method that marshals the addressinformation into the classes internal static IPAddressCollection ToAddressCollection(IntPtr ptr,IPVersion versionSupported) { //we don't know the number of addresses up front, so we create an arraylist //to temporarily store them. IPAddressCollection addressList = new IPAddressCollection(); //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(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; //only add addresses that are the same type as what is supported by the interface //this fixes a bug in iphelper regarding dns addresses if (((family == AddressFamily.InterNetwork) && ((versionSupported & IPVersion.IPv4) > 0)) || ((family == AddressFamily.InterNetworkV6) && ((versionSupported & IPVersion.IPv6) > 0))) { 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(ep.Address); } } return addressList; } //helper method that marshals the addressinformation into the classes internal static IPAddressInformationCollection ToAddressInformationCollection(IntPtr ptr,IPVersion versionSupported) { //we don't know the number of addresses up front, so we create an arraylist //to temporarily store them. IPAddressInformationCollection addressList = new IPAddressInformationCollection(); //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 SystemIPAddressInformation(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; //only add addresses that are the same type as what is supported by the interface //this fixes a bug in iphelper regarding dns addresses if (((family == AddressFamily.InterNetwork) && ((versionSupported & IPVersion.IPv4) > 0)) || ((family == AddressFamily.InterNetworkV6) && ((versionSupported & IPVersion.IPv6) > 0))) { 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 SystemIPAddressInformation(addr,ep.Address)); } } return addressList; } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TextSegment.cs
- ConnectionPoolManager.cs
- FragmentQueryProcessor.cs
- SmtpReplyReaderFactory.cs
- XmlEntity.cs
- IgnoreDeviceFilterElement.cs
- NameValueConfigurationCollection.cs
- HttpCapabilitiesBase.cs
- Point3DAnimationBase.cs
- AmbientProperties.cs
- RowSpanVector.cs
- ObjectContextServiceProvider.cs
- _OverlappedAsyncResult.cs
- AjaxFrameworkAssemblyAttribute.cs
- UnsafeNativeMethods.cs
- DPCustomTypeDescriptor.cs
- BinaryObjectReader.cs
- RegexParser.cs
- ConfigsHelper.cs
- _NativeSSPI.cs
- GridViewEditEventArgs.cs
- KeysConverter.cs
- PersistenceContext.cs
- TraceContextRecord.cs
- InvokePattern.cs
- PermissionSetEnumerator.cs
- PropertyRef.cs
- ModelEditingScope.cs
- Vector3DValueSerializer.cs
- ElementsClipboardData.cs
- Cloud.cs
- CqlQuery.cs
- SortDescriptionCollection.cs
- DSASignatureDeformatter.cs
- IdentityValidationException.cs
- WindowsFormsSectionHandler.cs
- EllipseGeometry.cs
- GlyphRun.cs
- GenericWebPart.cs
- KeyInstance.cs
- WindowsTokenRoleProvider.cs
- DbConnectionPoolGroupProviderInfo.cs
- IPAddress.cs
- ExceptionWrapper.cs
- ServiceSettingsResponseInfo.cs
- baseaxisquery.cs
- QuaternionAnimationBase.cs
- PersonalizablePropertyEntry.cs
- Lasso.cs
- CommentAction.cs
- SortKey.cs
- LinkedList.cs
- TextCompositionManager.cs
- WriteTimeStream.cs
- ChainOfDependencies.cs
- DataGridTableCollection.cs
- BuiltInExpr.cs
- MetadataCache.cs
- FileRecordSequenceCompletedAsyncResult.cs
- ParameterElement.cs
- ControlCachePolicy.cs
- HwndHostAutomationPeer.cs
- TaskHelper.cs
- MenuItem.cs
- Marshal.cs
- TokenizerHelper.cs
- Assign.cs
- RepeatBehavior.cs
- Viewport3DAutomationPeer.cs
- _ProxyChain.cs
- ErrorRuntimeConfig.cs
- DialogResultConverter.cs
- SByteStorage.cs
- OleDbStruct.cs
- UpdatePanelTriggerCollection.cs
- MembershipUser.cs
- XmlDataDocument.cs
- BulletedList.cs
- ReadOnlyNameValueCollection.cs
- SocketManager.cs
- COSERVERINFO.cs
- Context.cs
- XmlQueryOutput.cs
- wgx_sdk_version.cs
- DataTemplate.cs
- GridViewCellAutomationPeer.cs
- SaveFileDialog.cs
- AttributeQuery.cs
- HashSet.cs
- PingReply.cs
- ResourceLoader.cs
- MobileContainerDesigner.cs
- GridToolTip.cs
- AxHost.cs
- ChangeDirector.cs
- GlyphCollection.cs
- WindowAutomationPeer.cs
- UnmanagedMemoryStream.cs
- PropertyMappingExceptionEventArgs.cs
- ZipPackage.cs