Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Net / System / Net / NetworkInformation / SystemIPInterfaceProperties.cs / 5 / SystemIPInterfaceProperties.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;
///
/// Provides information specific to a network
/// interface.
///
///
/// Provides information specific to a network interface. A network interface can have more than one IPAddress associated with it. If the machine is >= XP, we call the native GetAdaptersAddresses api to
/// prepopulate all of the interface instances and most of their associated information. Otherwise,
/// GetAdaptersInfo is called.
///
internal class SystemIPInterfaceProperties:IPInterfaceProperties {
//common properties
uint mtu;
//Unfortunately, any interface can
//have two completely different valid indexes for ipv4 and ipv6
internal uint index = 0;
internal uint ipv6Index = 0;
internal IPVersion versionSupported = IPVersion.None;
//these are valid for all interfaces
bool dnsEnabled = false;
bool dynamicDnsEnabled = false; //os>=xp only
IPAddressCollection dnsAddresses = null;
UnicastIPAddressInformationCollection unicastAddresses = null;
//OS >= XP only
MulticastIPAddressInformationCollection multicastAddresses = null;
IPAddressInformationCollection anycastAddresses = null;
AdapterFlags adapterFlags;
string dnsSuffix;
string name;
//ipv4 only
//
SystemIPv4InterfaceProperties ipv4Properties;
SystemIPv6InterfaceProperties ipv6Properties;
private SystemIPInterfaceProperties(){}
//This constructor is used only in the OS>=XP case
//and uses the GetAdapterAddresses api
internal SystemIPInterfaceProperties(FixedInfo fixedInfo, IpAdapterAddresses ipAdapterAddresses) {
//network params info
dnsEnabled = fixedInfo.EnableDns;
//store the common api information
index = ipAdapterAddresses.index;
name = ipAdapterAddresses.AdapterName;
//api specific info
ipv6Index = ipAdapterAddresses.ipv6Index;
if (index > 0)
versionSupported |= IPVersion.IPv4;
if (ipv6Index > 0)
versionSupported |= IPVersion.IPv6;
mtu = ipAdapterAddresses.mtu;
adapterFlags = ipAdapterAddresses.flags;
dnsSuffix = ipAdapterAddresses.dnsSuffix;
dynamicDnsEnabled = ((ipAdapterAddresses.flags & AdapterFlags.DnsEnabled) > 0);
multicastAddresses = SystemMulticastIPAddressInformation.ToAddressInformationCollection(ipAdapterAddresses.FirstMulticastAddress);
dnsAddresses = SystemIPAddressInformation.ToAddressCollection(ipAdapterAddresses.FirstDnsServerAddress,versionSupported);
anycastAddresses = SystemIPAddressInformation.ToAddressInformationCollection(ipAdapterAddresses.FirstAnycastAddress,versionSupported);
unicastAddresses = SystemUnicastIPAddressInformation.ToAddressInformationCollection(ipAdapterAddresses.FirstUnicastAddress);
if (ipv6Index > 0){
ipv6Properties = new SystemIPv6InterfaceProperties(ipv6Index,mtu);
}
}
//This constructor is used only in the OS 0)
versionSupported |= IPVersion.IPv4;
//have to get the suffix from the registry if 2k
if (ComNetOS.IsWin2K)
ReadRegDnsSuffix();
//get ipaddresses
unicastAddresses = new UnicastIPAddressInformationCollection();
ArrayList ipAddresses = ipAdapterInfo.ipAddressList.ToIPExtendedAddressArrayList();
foreach (IPExtendedAddress address in ipAddresses) {
unicastAddresses.InternalAdd(new SystemUnicastIPAddressInformation(ipAdapterInfo,address));
}
try {
ipv4Properties = new SystemIPv4InterfaceProperties(fixedInfo,ipAdapterInfo);
if (dnsAddresses == null || dnsAddresses.Count == 0) {
dnsAddresses = ((SystemIPv4InterfaceProperties)ipv4Properties).DnsAddresses;
}
}
catch (NetworkInformationException exception) {
if (exception.ErrorCode != IpHelperErrors.ErrorInvalidParameter)
throw;
}
}
public override bool IsDnsEnabled{get { return dnsEnabled;}}
//only valid for OS>=XP
public override bool IsDynamicDnsEnabled{get {return dynamicDnsEnabled;}}
// Stats specific for Ipv4. Ipv6 will be added in Longhorn
public override IPv4InterfaceProperties GetIPv4Properties(){
if (index == 0) {
throw new NetworkInformationException(SocketError.ProtocolNotSupported);
}
return ipv4Properties;
}
// Stats specific for Ipv4. Ipv6 will be added in Longhorn
public override IPv6InterfaceProperties GetIPv6Properties(){
if (ipv6Index == 0) {
throw new NetworkInformationException(SocketError.ProtocolNotSupported);
}
return ipv6Properties;
}
public override string DnsSuffix {
get {
if (! ComNetOS.IsWin2K)
throw new PlatformNotSupportedException(SR.GetString(SR.Win2000Required));
return dnsSuffix;
}
}
//returns the addresses specified by the address type.
public override IPAddressInformationCollection AnycastAddresses{
get{
return anycastAddresses;
}
}
//returns the addresses specified by the address type.
public override UnicastIPAddressInformationCollection UnicastAddresses{
get{
return unicastAddresses;
}
}
//returns the addresses specified by the address type.
public override MulticastIPAddressInformationCollection MulticastAddresses{
get{
return multicastAddresses;
}
}
//returns the addresses specified by the address type.
public override IPAddressCollection DnsAddresses{
get{
return dnsAddresses;
}
}
/// IP Address of the default gateway.
public override GatewayIPAddressInformationCollection GatewayAddresses{
get{
if (ipv4Properties != null) {
return ipv4Properties.GetGatewayAddresses();
}
return new GatewayIPAddressInformationCollection();
}
}
public override IPAddressCollection DhcpServerAddresses{
get{
if (ipv4Properties != null) {
return ipv4Properties.GetDhcpServerAddresses();
}
return new IPAddressCollection();
}
}
public override IPAddressCollection WinsServersAddresses{
get{
if (ipv4Properties != null) {
return ipv4Properties.GetWinsServersAddresses();
}
return new IPAddressCollection();
}
}
//This method is invoked to fill in the rest of the values
//for ipv4 interfaces that aren't available via GetAdapterAddresses
internal bool Update(FixedInfo fixedInfo,IpAdapterInfo ipAdapterInfo) {
try {
ArrayList ipAddresses = ipAdapterInfo.ipAddressList.ToIPExtendedAddressArrayList();
foreach (IPExtendedAddress extendedAddress in ipAddresses) {
foreach(SystemUnicastIPAddressInformation unicastAddress in unicastAddresses){
if(extendedAddress.address.Equals(unicastAddress.Address)){
unicastAddress.ipv4Mask = extendedAddress.mask;
}
}
}
ipv4Properties = new SystemIPv4InterfaceProperties(fixedInfo,ipAdapterInfo);
if (dnsAddresses == null || dnsAddresses.Count == 0) {
dnsAddresses = ((SystemIPv4InterfaceProperties)ipv4Properties).DnsAddresses;
}
}
catch (NetworkInformationException exception) {
if (exception.ErrorCode == IpHelperErrors.ErrorInvalidParameter ||
exception.ErrorCode == IpHelperErrors.ErrorInvalidData ||
exception.ErrorCode == IpHelperErrors.ErrorNoData ||
exception.ErrorCode == IpHelperErrors.ErrorInvalidFunction ||
exception.ErrorCode == IpHelperErrors.ErrorNoSuchDevice)
return false;
throw;
}
return true;
}
[RegistryPermission(SecurityAction.Assert, Read="HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces")]
private void ReadRegDnsSuffix() {
RegistryKey key = null;
try {
string subKey = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + name;
key = Registry.LocalMachine.OpenSubKey(subKey);
if (null != key) {
dnsSuffix = (string) key.GetValue("DhcpDomain");
if (dnsSuffix == null ) {
dnsSuffix = (string) key.GetValue("Domain");
if (dnsSuffix == null) {
dnsSuffix = String.Empty;
}
}
}
}
finally{
if (null != key){
key.Close();
}
}
}
/*
[RegistryPermission(SecurityAction.Assert, Read="HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces")]
private uint ReadRegMetric(bool ipv6) {
RegistryKey key = null;
uint metric = 0;
try {
string subKey;
if(ipv6){
"SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters\\Interfaces\\" + name;
}
else{
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + name;
}
key = Registry.LocalMachine.OpenSubKey(subKey);
if (null != key) {
metric = (uint) key.GetValue("InterfaceMetric");
}
}
finally{
if (null != key){
key.Close();
}
}
return metric;
}
*/
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
///
/// 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;
///
/// Provides information specific to a network
/// interface.
///
///
/// Provides information specific to a network interface. A network interface can have more than one IPAddress associated with it. If the machine is >= XP, we call the native GetAdaptersAddresses api to
/// prepopulate all of the interface instances and most of their associated information. Otherwise,
/// GetAdaptersInfo is called.
///
internal class SystemIPInterfaceProperties:IPInterfaceProperties {
//common properties
uint mtu;
//Unfortunately, any interface can
//have two completely different valid indexes for ipv4 and ipv6
internal uint index = 0;
internal uint ipv6Index = 0;
internal IPVersion versionSupported = IPVersion.None;
//these are valid for all interfaces
bool dnsEnabled = false;
bool dynamicDnsEnabled = false; //os>=xp only
IPAddressCollection dnsAddresses = null;
UnicastIPAddressInformationCollection unicastAddresses = null;
//OS >= XP only
MulticastIPAddressInformationCollection multicastAddresses = null;
IPAddressInformationCollection anycastAddresses = null;
AdapterFlags adapterFlags;
string dnsSuffix;
string name;
//ipv4 only
//
SystemIPv4InterfaceProperties ipv4Properties;
SystemIPv6InterfaceProperties ipv6Properties;
private SystemIPInterfaceProperties(){}
//This constructor is used only in the OS>=XP case
//and uses the GetAdapterAddresses api
internal SystemIPInterfaceProperties(FixedInfo fixedInfo, IpAdapterAddresses ipAdapterAddresses) {
//network params info
dnsEnabled = fixedInfo.EnableDns;
//store the common api information
index = ipAdapterAddresses.index;
name = ipAdapterAddresses.AdapterName;
//api specific info
ipv6Index = ipAdapterAddresses.ipv6Index;
if (index > 0)
versionSupported |= IPVersion.IPv4;
if (ipv6Index > 0)
versionSupported |= IPVersion.IPv6;
mtu = ipAdapterAddresses.mtu;
adapterFlags = ipAdapterAddresses.flags;
dnsSuffix = ipAdapterAddresses.dnsSuffix;
dynamicDnsEnabled = ((ipAdapterAddresses.flags & AdapterFlags.DnsEnabled) > 0);
multicastAddresses = SystemMulticastIPAddressInformation.ToAddressInformationCollection(ipAdapterAddresses.FirstMulticastAddress);
dnsAddresses = SystemIPAddressInformation.ToAddressCollection(ipAdapterAddresses.FirstDnsServerAddress,versionSupported);
anycastAddresses = SystemIPAddressInformation.ToAddressInformationCollection(ipAdapterAddresses.FirstAnycastAddress,versionSupported);
unicastAddresses = SystemUnicastIPAddressInformation.ToAddressInformationCollection(ipAdapterAddresses.FirstUnicastAddress);
if (ipv6Index > 0){
ipv6Properties = new SystemIPv6InterfaceProperties(ipv6Index,mtu);
}
}
//This constructor is used only in the OS 0)
versionSupported |= IPVersion.IPv4;
//have to get the suffix from the registry if 2k
if (ComNetOS.IsWin2K)
ReadRegDnsSuffix();
//get ipaddresses
unicastAddresses = new UnicastIPAddressInformationCollection();
ArrayList ipAddresses = ipAdapterInfo.ipAddressList.ToIPExtendedAddressArrayList();
foreach (IPExtendedAddress address in ipAddresses) {
unicastAddresses.InternalAdd(new SystemUnicastIPAddressInformation(ipAdapterInfo,address));
}
try {
ipv4Properties = new SystemIPv4InterfaceProperties(fixedInfo,ipAdapterInfo);
if (dnsAddresses == null || dnsAddresses.Count == 0) {
dnsAddresses = ((SystemIPv4InterfaceProperties)ipv4Properties).DnsAddresses;
}
}
catch (NetworkInformationException exception) {
if (exception.ErrorCode != IpHelperErrors.ErrorInvalidParameter)
throw;
}
}
public override bool IsDnsEnabled{get { return dnsEnabled;}}
//only valid for OS>=XP
public override bool IsDynamicDnsEnabled{get {return dynamicDnsEnabled;}}
// Stats specific for Ipv4. Ipv6 will be added in Longhorn
public override IPv4InterfaceProperties GetIPv4Properties(){
if (index == 0) {
throw new NetworkInformationException(SocketError.ProtocolNotSupported);
}
return ipv4Properties;
}
// Stats specific for Ipv4. Ipv6 will be added in Longhorn
public override IPv6InterfaceProperties GetIPv6Properties(){
if (ipv6Index == 0) {
throw new NetworkInformationException(SocketError.ProtocolNotSupported);
}
return ipv6Properties;
}
public override string DnsSuffix {
get {
if (! ComNetOS.IsWin2K)
throw new PlatformNotSupportedException(SR.GetString(SR.Win2000Required));
return dnsSuffix;
}
}
//returns the addresses specified by the address type.
public override IPAddressInformationCollection AnycastAddresses{
get{
return anycastAddresses;
}
}
//returns the addresses specified by the address type.
public override UnicastIPAddressInformationCollection UnicastAddresses{
get{
return unicastAddresses;
}
}
//returns the addresses specified by the address type.
public override MulticastIPAddressInformationCollection MulticastAddresses{
get{
return multicastAddresses;
}
}
//returns the addresses specified by the address type.
public override IPAddressCollection DnsAddresses{
get{
return dnsAddresses;
}
}
/// IP Address of the default gateway.
public override GatewayIPAddressInformationCollection GatewayAddresses{
get{
if (ipv4Properties != null) {
return ipv4Properties.GetGatewayAddresses();
}
return new GatewayIPAddressInformationCollection();
}
}
public override IPAddressCollection DhcpServerAddresses{
get{
if (ipv4Properties != null) {
return ipv4Properties.GetDhcpServerAddresses();
}
return new IPAddressCollection();
}
}
public override IPAddressCollection WinsServersAddresses{
get{
if (ipv4Properties != null) {
return ipv4Properties.GetWinsServersAddresses();
}
return new IPAddressCollection();
}
}
//This method is invoked to fill in the rest of the values
//for ipv4 interfaces that aren't available via GetAdapterAddresses
internal bool Update(FixedInfo fixedInfo,IpAdapterInfo ipAdapterInfo) {
try {
ArrayList ipAddresses = ipAdapterInfo.ipAddressList.ToIPExtendedAddressArrayList();
foreach (IPExtendedAddress extendedAddress in ipAddresses) {
foreach(SystemUnicastIPAddressInformation unicastAddress in unicastAddresses){
if(extendedAddress.address.Equals(unicastAddress.Address)){
unicastAddress.ipv4Mask = extendedAddress.mask;
}
}
}
ipv4Properties = new SystemIPv4InterfaceProperties(fixedInfo,ipAdapterInfo);
if (dnsAddresses == null || dnsAddresses.Count == 0) {
dnsAddresses = ((SystemIPv4InterfaceProperties)ipv4Properties).DnsAddresses;
}
}
catch (NetworkInformationException exception) {
if (exception.ErrorCode == IpHelperErrors.ErrorInvalidParameter ||
exception.ErrorCode == IpHelperErrors.ErrorInvalidData ||
exception.ErrorCode == IpHelperErrors.ErrorNoData ||
exception.ErrorCode == IpHelperErrors.ErrorInvalidFunction ||
exception.ErrorCode == IpHelperErrors.ErrorNoSuchDevice)
return false;
throw;
}
return true;
}
[RegistryPermission(SecurityAction.Assert, Read="HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces")]
private void ReadRegDnsSuffix() {
RegistryKey key = null;
try {
string subKey = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + name;
key = Registry.LocalMachine.OpenSubKey(subKey);
if (null != key) {
dnsSuffix = (string) key.GetValue("DhcpDomain");
if (dnsSuffix == null ) {
dnsSuffix = (string) key.GetValue("Domain");
if (dnsSuffix == null) {
dnsSuffix = String.Empty;
}
}
}
}
finally{
if (null != key){
key.Close();
}
}
}
/*
[RegistryPermission(SecurityAction.Assert, Read="HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces")]
private uint ReadRegMetric(bool ipv6) {
RegistryKey key = null;
uint metric = 0;
try {
string subKey;
if(ipv6){
"SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters\\Interfaces\\" + name;
}
else{
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\" + name;
}
key = Registry.LocalMachine.OpenSubKey(subKey);
if (null != key) {
metric = (uint) key.GetValue("InterfaceMetric");
}
}
finally{
if (null != key){
key.Close();
}
}
return metric;
}
*/
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DbParameterCollection.cs
- ResizeGrip.cs
- QueryStringParameter.cs
- CodeLabeledStatement.cs
- MenuEventArgs.cs
- AjaxFrameworkAssemblyAttribute.cs
- WindowsSlider.cs
- XmlSchemaParticle.cs
- PageRouteHandler.cs
- TemplateNameScope.cs
- GroupBoxRenderer.cs
- DecimalAnimation.cs
- BaseCollection.cs
- MethodToken.cs
- ValidationResults.cs
- listitem.cs
- FullTextLine.cs
- Adorner.cs
- Stream.cs
- XmlSchemaInferenceException.cs
- MimePart.cs
- C14NUtil.cs
- PersonalizablePropertyEntry.cs
- HtmlInputButton.cs
- ScriptComponentDescriptor.cs
- XhtmlBasicPanelAdapter.cs
- MergePropertyDescriptor.cs
- XmlRawWriter.cs
- EdmToObjectNamespaceMap.cs
- PixelFormat.cs
- IDQuery.cs
- HtmlValidatorAdapter.cs
- PKCS1MaskGenerationMethod.cs
- DayRenderEvent.cs
- HttpContextBase.cs
- SubclassTypeValidatorAttribute.cs
- ZipIOExtraFieldPaddingElement.cs
- ColumnResizeUndoUnit.cs
- ActivityMarkupSerializationProvider.cs
- SqlNotificationRequest.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- NoneExcludedImageIndexConverter.cs
- ExtendLockAsyncResult.cs
- MulticastNotSupportedException.cs
- DocumentsTrace.cs
- EditorZoneBase.cs
- initElementDictionary.cs
- ServiceMemoryGates.cs
- EventRoute.cs
- Duration.cs
- TargetPerspective.cs
- X509Chain.cs
- JsonCollectionDataContract.cs
- UriGenerator.cs
- Visual3D.cs
- ProxyBuilder.cs
- RuntimeHelpers.cs
- DateTimeFormat.cs
- BinaryOperationBinder.cs
- FixedFindEngine.cs
- Baml2006KeyRecord.cs
- ErrorHandlingReceiver.cs
- SafeThreadHandle.cs
- ValidatingReaderNodeData.cs
- Char.cs
- SiteIdentityPermission.cs
- SystemIPv6InterfaceProperties.cs
- ScrollableControl.cs
- Version.cs
- SwitchElementsCollection.cs
- ClientRuntimeConfig.cs
- EnumDataContract.cs
- XPathAxisIterator.cs
- ImageListImage.cs
- unitconverter.cs
- CriticalExceptions.cs
- SoapSchemaImporter.cs
- Brushes.cs
- TypedDataSetSchemaImporterExtensionFx35.cs
- Processor.cs
- Util.cs
- MonitoringDescriptionAttribute.cs
- DataGrid.cs
- RegexCompiler.cs
- HwndProxyElementProvider.cs
- DelegateBodyWriter.cs
- ObjectViewEntityCollectionData.cs
- TextServicesDisplayAttribute.cs
- EntityDataSourceMemberPath.cs
- OSFeature.cs
- TaiwanCalendar.cs
- EntityConnection.cs
- DataListGeneralPage.cs
- MenuTracker.cs
- DesignOnlyAttribute.cs
- CodeObjectCreateExpression.cs
- CorrelationService.cs
- LinearGradientBrush.cs
- IItemContainerGenerator.cs
- RadioButton.cs