Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Net / System / Net / _NetworkingPerfCounters.cs / 1 / _NetworkingPerfCounters.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Net { using System; using System.Reflection; using System.Net.Sockets; using System.Diagnostics; using System.Security.Permissions; using System.ComponentModel; using System.Globalization; using System.Text; // // This implementation uses the PerformanceCounter object defined in // System.Diagnostics, too bad it doesn't work 'cause the runtime defines // the counter and doesn't expose the API // internal static class NetworkingPerfCounters { private static PerformanceCounter ConnectionsEstablished, BytesReceived, BytesSent, DatagramsReceived, DatagramsSent; private static PerformanceCounter globalConnectionsEstablished, globalBytesReceived, globalBytesSent, globalDatagramsReceived, globalDatagramsSent; private const string CategoryName = ".NET CLR Networking"; private const string ConnectionsEstablishedName = "Connections Established"; private const string BytesReceivedName = "Bytes Received"; private const string BytesSentName = "Bytes Sent"; private const string DatagramsReceivedName = "Datagrams Received"; private const string DatagramsSentName = "Datagrams Sent"; private const string GlobalInstanceName = "_Global_"; private static object syncObject = new object(); private static bool initialized = false; internal static void Initialize() { if(!initialized){ lock(syncObject){ if(!initialized){ // // on Win9x you have no PerfCounters // on NT4 PerfCounters are not writable // if (ComNetOS.IsWin2K) { // // this is an internal class, we need to update performance counters // on behalf of the user to log perf data on network activity // // < PerformanceCounterPermission perfCounterPermission = new PerformanceCounterPermission(PermissionState.Unrestricted); perfCounterPermission.Assert(); try { // // create the counters, this will check for the right permissions (false) // means the counter is not readonly (it's read/write) and cache them while // we're under the Assert(), which will be reverted in the finally below. // // Changed due to a recent Whidbey DCR to fix spinlock issues. To get the new behavior, we have to use the // default constructor and set the properties inidividually // #498527 string instanceName = GetInstanceName(); ConnectionsEstablished = new PerformanceCounter(); ConnectionsEstablished.CategoryName = CategoryName; ConnectionsEstablished.CounterName = ConnectionsEstablishedName; ConnectionsEstablished.InstanceName = instanceName; ConnectionsEstablished.InstanceLifetime = PerformanceCounterInstanceLifetime.Process; ConnectionsEstablished.ReadOnly = false; ConnectionsEstablished.RawValue = 0; BytesReceived = new PerformanceCounter(); BytesReceived.CategoryName = CategoryName; BytesReceived.CounterName = BytesReceivedName; BytesReceived.InstanceName = instanceName; BytesReceived.InstanceLifetime = PerformanceCounterInstanceLifetime.Process; BytesReceived.ReadOnly = false; BytesReceived.RawValue = 0; BytesSent = new PerformanceCounter(); BytesSent.CategoryName = CategoryName; BytesSent.CounterName = BytesSentName; BytesSent.InstanceName = instanceName; BytesSent.InstanceLifetime = PerformanceCounterInstanceLifetime.Process; BytesSent.ReadOnly = false; BytesSent.RawValue = 0; DatagramsReceived = new PerformanceCounter(); DatagramsReceived.CategoryName = CategoryName; DatagramsReceived.CounterName = DatagramsReceivedName; DatagramsReceived.InstanceName = instanceName; DatagramsReceived.InstanceLifetime = PerformanceCounterInstanceLifetime.Process; DatagramsReceived.ReadOnly = false; DatagramsReceived.RawValue = 0; DatagramsSent = new PerformanceCounter(); DatagramsSent.CategoryName = CategoryName; DatagramsSent.CounterName = DatagramsSentName; DatagramsSent.InstanceName = instanceName; DatagramsSent.InstanceLifetime = PerformanceCounterInstanceLifetime.Process; DatagramsSent.ReadOnly = false; DatagramsSent.RawValue = 0; // // Get a handle onto the global ones too. Do not reset to zero. // globalConnectionsEstablished = new PerformanceCounter(CategoryName, ConnectionsEstablishedName, GlobalInstanceName, false); globalBytesReceived = new PerformanceCounter(CategoryName, BytesReceivedName, GlobalInstanceName, false); globalBytesSent = new PerformanceCounter(CategoryName, BytesSentName, GlobalInstanceName, false); globalDatagramsReceived = new PerformanceCounter(CategoryName, DatagramsReceivedName, GlobalInstanceName, false); globalDatagramsSent = new PerformanceCounter(CategoryName, DatagramsSentName, GlobalInstanceName, false); AppDomain.CurrentDomain.DomainUnload += new EventHandler(ExitOrUnloadEventHandler); AppDomain.CurrentDomain.ProcessExit += new EventHandler(ExitOrUnloadEventHandler); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ExceptionEventHandler); } catch (Win32Exception exception) { GlobalLog.Print("NetworkingPerfCounters::NetworkingPerfCounters() caught exception:" + exception); } catch (InvalidOperationException exception) { GlobalLog.Print("NetworkingPerfCounters::NetworkingPerfCounters() caught exception:" + exception); } finally { PerformanceCounterPermission.RevertAssert(); } } initialized = true; } } } } private static void ExceptionEventHandler (object sender, UnhandledExceptionEventArgs e) { if (e.IsTerminating) { Cleanup(); } } private static void ExitOrUnloadEventHandler(object sender, EventArgs e) { Cleanup(); } private static void Cleanup() { PerformanceCounter performanceCounter; performanceCounter = ConnectionsEstablished; if (performanceCounter!=null) { performanceCounter.RemoveInstance(); } performanceCounter = BytesReceived; if (performanceCounter!=null) { performanceCounter.RemoveInstance(); } performanceCounter = BytesSent; if (performanceCounter!=null) { performanceCounter.RemoveInstance(); } performanceCounter = DatagramsReceived; if (performanceCounter!=null) { performanceCounter.RemoveInstance(); } performanceCounter = DatagramsSent; if (performanceCounter!=null) { performanceCounter.RemoveInstance(); } // No need to clean up the global ones. } [FileIOPermission(SecurityAction.Assert, Unrestricted = true)] private static string GetAssemblyName() { string result = null; Assembly assembly = Assembly.GetEntryAssembly(); if (assembly!=null) { AssemblyName name = assembly.GetName(); if (name!=null) { result = name.Name; } } return result; } [SecurityPermission(SecurityAction.Assert, Unrestricted = true)] private static string GetInstanceName() { string result = null; string instanceName = GetAssemblyName(); if (instanceName==null || instanceName.Length==0) { instanceName = AppDomain.CurrentDomain.FriendlyName; } StringBuilder instanceBuilder = new StringBuilder(instanceName); for (int i = 0; i < instanceBuilder.Length; i++) { switch (instanceBuilder[i]) { case '(': instanceBuilder[i] = '['; break; case ')': instanceBuilder[i] = ']'; break; case '/': case '\\': case '#': instanceBuilder[i] = '_'; break; } } result = string.Format(CultureInfo.CurrentCulture, "{0}[{1}]", instanceBuilder.ToString(), Process.GetCurrentProcess().Id); return result; } internal static void IncrementConnectionsEstablished() { if (ConnectionsEstablished != null) { ConnectionsEstablished.Increment(); } if (globalConnectionsEstablished != null) { globalConnectionsEstablished.Increment(); GlobalLog.Print("NetworkingPerfCounters::IncrementConnectionsEstablished()"); } } internal static void AddBytesReceived(int increment) { if (BytesReceived != null) { BytesReceived.IncrementBy(increment); } if (globalBytesReceived != null) { globalBytesReceived.IncrementBy(increment); GlobalLog.Print("NetworkingPerfCounters::AddBytesReceived(" + increment.ToString() + ")"); } } internal static void AddBytesSent(int increment) { if (BytesSent != null) { BytesSent.IncrementBy(increment); } if (globalBytesSent != null) { globalBytesSent.IncrementBy(increment); GlobalLog.Print("NetworkingPerfCounters::AddBytesSent(" + increment.ToString() + ")"); } } internal static void IncrementDatagramsReceived() { if (DatagramsReceived != null) { DatagramsReceived.Increment(); } if (globalDatagramsReceived != null) { globalDatagramsReceived.Increment(); GlobalLog.Print("NetworkingPerfCounters::IncrementDatagramsReceived()"); } } internal static void IncrementDatagramsSent() { if (DatagramsSent != null) { DatagramsSent.Increment(); } if (globalDatagramsSent != null) { globalDatagramsSent.Increment(); GlobalLog.Print("NetworkingPerfCounters::IncrementDatagramsSent()"); } } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- IndicFontClient.cs
- WebPartHeaderCloseVerb.cs
- SpeechSeg.cs
- MenuBase.cs
- DataViewManager.cs
- CapabilitiesSection.cs
- RootBuilder.cs
- Schema.cs
- TreeViewImageKeyConverter.cs
- Page.cs
- SQLBinary.cs
- ObjectQuery_EntitySqlExtensions.cs
- EntityDataSourceQueryBuilder.cs
- SmtpDigestAuthenticationModule.cs
- RequestStatusBarUpdateEventArgs.cs
- KeyBinding.cs
- EditorZone.cs
- TemplateBindingExtensionConverter.cs
- SafeEventLogWriteHandle.cs
- EventSinkHelperWriter.cs
- Char.cs
- ServiceContractDetailViewControl.cs
- VariableExpressionConverter.cs
- Parser.cs
- InvalidComObjectException.cs
- WsdlParser.cs
- HttpHostedTransportConfiguration.cs
- PermissionSetEnumerator.cs
- GridEntryCollection.cs
- ObjectQueryExecutionPlan.cs
- BinaryNode.cs
- XhtmlTextWriter.cs
- DataDocumentXPathNavigator.cs
- MLangCodePageEncoding.cs
- MulticastIPAddressInformationCollection.cs
- XNodeNavigator.cs
- HandledEventArgs.cs
- RegisteredDisposeScript.cs
- SessionSwitchEventArgs.cs
- SettingsContext.cs
- ToolStripOverflow.cs
- XmlName.cs
- XmlUtil.cs
- HandlerBase.cs
- ProfileSettingsCollection.cs
- MimeParameterWriter.cs
- Win32.cs
- _LazyAsyncResult.cs
- DetailsViewActionList.cs
- Properties.cs
- FontFamilyConverter.cs
- DocumentXPathNavigator.cs
- FrameworkContentElement.cs
- UniqueContractNameValidationBehavior.cs
- MimePart.cs
- HostProtectionPermission.cs
- ApplicationDirectory.cs
- CodeBinaryOperatorExpression.cs
- nulltextcontainer.cs
- CalendarDay.cs
- MemberAssignmentAnalysis.cs
- SymDocumentType.cs
- BaseResourcesBuildProvider.cs
- ItemCheckEvent.cs
- Transform3DGroup.cs
- BitmapEffectGroup.cs
- ResourceExpressionBuilder.cs
- DbProviderServices.cs
- ServicePointManagerElement.cs
- ConnectionInterfaceCollection.cs
- TraceFilter.cs
- CodeDirectoryCompiler.cs
- SplitterCancelEvent.cs
- OleStrCAMarshaler.cs
- WebBrowserContainer.cs
- ProgressBar.cs
- FixedSOMLineRanges.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- RayHitTestParameters.cs
- StringUtil.cs
- FreezableOperations.cs
- HashRepartitionStream.cs
- XmlElementAttributes.cs
- TextTreeInsertUndoUnit.cs
- XmlBinaryReader.cs
- DiscreteKeyFrames.cs
- SafeNativeMethodsOther.cs
- GB18030Encoding.cs
- WebSysDefaultValueAttribute.cs
- ContentValidator.cs
- CompilerParameters.cs
- KeyToListMap.cs
- WebPartVerb.cs
- XPathParser.cs
- GatewayDefinition.cs
- LicenseException.cs
- CodeLabeledStatement.cs
- TextAnchor.cs
- userdatakeys.cs
- AxHostDesigner.cs