Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Net / System / Net / NetworkInformation / SystemIPAddressInformation.cs / 1 / SystemIPAddressInformation.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;
//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;}}
/// 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
- GAC.cs
- SpanIndex.cs
- PublishLicense.cs
- ActiveXHost.cs
- CodeMemberEvent.cs
- XmlSchemaSimpleContentExtension.cs
- XamlTreeBuilderBamlRecordWriter.cs
- CodeLabeledStatement.cs
- OletxResourceManager.cs
- TimelineGroup.cs
- XmlReflectionMember.cs
- DataPager.cs
- DataGridViewButtonColumn.cs
- NumberFormatInfo.cs
- CommonDialog.cs
- FormParameter.cs
- VectorCollection.cs
- AuthenticationSection.cs
- CommandArguments.cs
- TokenizerHelper.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- BaseInfoTable.cs
- TextSerializer.cs
- UnsafeNativeMethodsMilCoreApi.cs
- ADRoleFactoryConfiguration.cs
- InlineCollection.cs
- HtmlInputText.cs
- QilFactory.cs
- UriTemplatePathPartiallyEquivalentSet.cs
- WebPartDisplayModeCollection.cs
- ProfileSettings.cs
- TemplateBindingExpressionConverter.cs
- SmtpAuthenticationManager.cs
- DescendentsWalkerBase.cs
- FaultDesigner.cs
- Ipv6Element.cs
- DesignerAutoFormatStyle.cs
- RenderData.cs
- ConnectionOrientedTransportManager.cs
- ScrollEventArgs.cs
- FirstMatchCodeGroup.cs
- CookielessData.cs
- HtmlContainerControl.cs
- WindowsImpersonationContext.cs
- ApplicationManager.cs
- SchemaExporter.cs
- ColorContext.cs
- InlineCollection.cs
- InternalControlCollection.cs
- GridViewSelectEventArgs.cs
- ViewManager.cs
- HandlerWithFactory.cs
- unsafenativemethodstextservices.cs
- StyleModeStack.cs
- ObjectDataSourceDisposingEventArgs.cs
- LongValidatorAttribute.cs
- WindowsPrincipal.cs
- SplitterCancelEvent.cs
- WebConfigurationFileMap.cs
- sqlser.cs
- HtmlPhoneCallAdapter.cs
- XslException.cs
- RectangleF.cs
- CheckedListBox.cs
- EventLogEntry.cs
- WorkflowWebHostingModule.cs
- SponsorHelper.cs
- EdmConstants.cs
- ToolZone.cs
- CodeTryCatchFinallyStatement.cs
- InstancePersistence.cs
- COM2IDispatchConverter.cs
- ProgressBarRenderer.cs
- PtsPage.cs
- ToolStripGripRenderEventArgs.cs
- SHA512.cs
- XsdCachingReader.cs
- SizeFConverter.cs
- TextServicesManager.cs
- SelectedDatesCollection.cs
- CustomBindingCollectionElement.cs
- SQLDouble.cs
- HttpValueCollection.cs
- EditorAttribute.cs
- FormsAuthenticationEventArgs.cs
- WebHttpBindingCollectionElement.cs
- Selector.cs
- SubMenuStyleCollection.cs
- WebEvents.cs
- GridViewRowEventArgs.cs
- PropertyPath.cs
- XmlAttributeAttribute.cs
- SignatureConfirmationElement.cs
- ArrayTypeMismatchException.cs
- NotCondition.cs
- RemoteWebConfigurationHostServer.cs
- XmlHierarchyData.cs
- TypeConverter.cs
- SignatureDescription.cs
- SqlException.cs