2009-01-14 25 views
15

¿Existe alguna forma de calcular el ancho de banda (paquetes enviados y recibidos) por un exe/aplicación a través de la red? han loooked en IPGlobalProperties,Cálculo del ancho de banda

y otras clases .... Quiero paquetes enviados n recibidos por una sola aplicación .. he comprobado http://netstatagent.com/ Necesito algo similar ... ¿hay algo en .NET que puede ayudar ¿yo?

Mi aplicación se conecta a un servicio web para enviar algunos archivos de imagen ... y también recibe archivos ...

Respuesta

21

Una forma es para recuperar el valor de la performance counters ".NET CLR Redes/Bytes recibido" y " .NET CLR/redes bytes enviados" para su aplicación:

PerformanceCounter bytesSentPerformanceCounter= new PerformanceCounter(); 
bytesSentPerformanceCounter.CategoryName = ".NET CLR Networking"; 
bytesSentPerformanceCounter.CounterName = "Bytes Sent"; 
bytesSentPerformanceCounter.InstanceName = GetInstanceName(); 
bytesSentPerformanceCounter.ReadOnly = true; 

float bytesSent = bytesSentPerformanceCounter.NextValue(); 

//.... 

private static string GetInstanceName() 
{ 
    // Used Reflector to find the correct formatting: 
    string assemblyName = GetAssemblyName(); 
    if ((assemblyName == null) || (assemblyName.Length == 0)) 
    { 
    assemblyName = AppDomain.CurrentDomain.FriendlyName; 
    } 
    StringBuilder builder = new StringBuilder(assemblyName); 
    for (int i = 0; i < builder.Length; i++) 
    { 
    switch (builder[i]) 
    { 
     case '/': 
     case '\\': 
     case '#': 
     builder[i] = '_'; 
     break; 
     case '(': 
     builder[i] = '['; 
     break; 

     case ')': 
     builder[i] = ']'; 
     break; 
    } 
    } 
    return string.Format(CultureInfo.CurrentCulture, 
         "{0}[{1}]", 
         builder.ToString(), 
         Process.GetCurrentProcess().Id); 
} 

private static string GetAssemblyName() 
{ 
    string str = null; 
    Assembly entryAssembly = Assembly.GetEntryAssembly(); 
    if (entryAssembly != null) 
    { 
    AssemblyName name = entryAssembly.GetName(); 
    if (name != null) 
    { 
     str = name.Name; 
    } 
    } 
    return str; 
} 

cuenta que el rendimiento contadoresno se crean hasta que la primera vez que se utilizan las bibliotecas de red relevantes (obtendrá InvalidOperation: Instancia 'XXX' no existe yo n la Categoría especificada) y que debe insertar

<configuration> 
    <system.net> 
    <settings> 
     <performanceCounters enabled="true" /> 
    </settings> 
    </system.net> 
</configuration> 

en su app.config.

Para obtener una muestra completa, descargue NetworkTraffic.cs y NetworkTraffic.exe.config.

+3

Este código ya no parece funcionar, y da 'nvalidOperation: La instancia 'XXX' no existe en el error de Categoría especificado' cada vez. – TheGateKeeper

+1

Estoy usando Windows 7 y .net 4.0 – TheGateKeeper

+0

"Tenga en cuenta que los contadores de rendimiento no se crean hasta la primera vez que utiliza las bibliotecas de red relevantes" esto debe ser en negrita:). Pasé mucho tiempo tratando de descubrir qué pasa, porque en otras soluciones no fue mencionado. –

0

buscando bytes/s por aplicación ... no para toda la computadora .... Parece que no funciona para una consola de aplicación ... Mensaje de error: "la aplicación de la consola no existe en la Categoría especificada. "

+0

Hay casos de contadores de rendimiento para cada proceso. Utiliza la propiedad InstanceName para seleccionar la que desea. (PD. Debería agregar un comentario en lugar de una respuesta para algo como esto). –

+0

Ver mi publicación actualizada. –

0

Esto no funciona ... Por lo que yo sé bytesSentPerformanceCounter.InstanceName = "" // aquí se necesita para dar nombre de la tarjeta de red ...

+0

InstanceName es el nombre de la instancia de PerformanceCounter. El CLR lo forma exactamente como en el código que escribí, básicamente "ApplicationName [ProcessId]". Intenta descargar el código que adjunté a la publicación original. Funciona perfectamente para mí (Vista 32 bit, .Net 2.0). –

+0

Hola Rasmus, gracias por su código ... está funcionando perfectamente ... Sin embargo, los bytes enviados y recibidos siempre son 0 ... Tengo que decir que sin duda están muy bien informados en esta área de .net ... No puedo agregar comentar como "comentar requiere 50 reputación" –

+0

Hola Rasmus, supongo que lo resolví ... muchas gracias ... Dios te bendiga, hombre ... –

0

alguna manera los bytes enviados es demasiado menos de bytes recibido ... no es esa red de navegación im de mi aplicación ... Envío a las imágenes del servicio web (como bytes) y otros archivos XML (pocos kbs como cadena de entrada a la función de servicio web). A cambio, a veces devuelvo códigos de error o bool ... aún los bytes enviados son demasiado menores que los recibidos ... recibí 5 veces más ... estoy perplejo ...

+0

Pruebe con WireShark para ver los datos realmente enviados y recibidos. Y compruebe dos veces que no ha cambiado recibido y enviado. También puede intentar inspeccionar los contadores de rendimiento utilizando el monitor de rendimiento. –

4

Recordé haber leído un artículo sobre esto y cavado para arriba para usted, http://nayyeri.net/blog/how-to-calculate-network-utilization-in-net/

un extracto antes de su código:

.NET viene con tres contadores de rendimiento para los parámetros utilizados en la red fórmula utilización de la caja . Todos estos contadores se encuentran en la categoría Interfaz de red y son llamados "Bytes enviados/seg.", "Bytes recibidos/seg." Y "Ancho de banda actual". El único parámetro que requiere un esfuerzo adicional para calcularse es time_in_sec.

"bytes enviados/seg" y "Bytes recibidos/s" contadores calculan sus valores basado en diferentes muestras y la mejor manera de conseguir un mejor valor de estos contadores es encontrar el suma de sus valores en un bucle porque en algunos casos sus valores pueden ser ser cero o muy diferente del estado real de la red. Entonces podemos encontrar el parámetro time_in_sec por encontrar el número de veces que se repite el bucle porque nuestros contadores de rendimiento a encontrar sus valores para uno segundos el tiempo total en segundos es igual al número de iteraciones .

Cuestiones relacionadas