elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  No puedo obtener estadística de subida y bajada de red en XP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No puedo obtener estadística de subida y bajada de red en XP  (Leído 1,201 veces)
Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
No puedo obtener estadística de subida y bajada de red en XP
« en: 15 Septiembre 2015, 19:32 pm »

Hola,

Con VB.Net 2010 y utilizando System.Net.NetworkInformation obtengo el valor de datos de subida y bajada de mi conexión.

El caso es que me funciona en Vista y Windows7  pero no en XP.

Esta es la función que he utilizado:

Código
  1. Public Class InformationNetWork
  2. Dim Estado As String
  3. Dim DatosRecibidos As String
  4. Dim DatosEnviados As String
  5.  
  6.    Public Function EnumerateNetwok()
  7.        Dim properties As System.Net.NetworkInformation.IPGlobalProperties = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties()
  8.        Dim ipstat As System.Net.NetworkInformation.IPGlobalStatistics = properties.GetIPv4GlobalStatistics()
  9.  
  10.  
  11.        '//Estado de red
  12.        Dim ipv4Stats As System.Net.NetworkInformation.IPv4InterfaceStatistics
  13.        ipv4Stats = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(0).GetIPv4Statistics
  14.  
  15.  
  16.        DatosRecibidos = ipv4Stats.BytesReceived.ToString
  17.        DatosEnviados = ipv4Stats.BytesSent.ToString
  18.  
  19.  
  20.        '//Estado Conexión
  21.  
  22.        Dim ipv4Time As System.Net.NetworkInformation.IPGlobalProperties = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties()
  23.        Try
  24.            Dim n = ipv4Time.GetActiveTcpConnections().Cast(Of System.Net.NetworkInformation.TcpConnectionInformation).First(Function(el) el.State)
  25.            Estado = n.State
  26.        Catch ex As Exception
  27.            Estado = "Desconectado"
  28.        End Try
  29.        Return 0
  30.    End Function
  31.  
  32.  
  33.  
  34.    Public Property DatesRecibidos As String
  35.        Get
  36.            Return DatosRecibidos
  37.        End Get
  38.        Set(ByVal value As String)
  39.        End Set
  40.    End Property
  41.    Public Property DatesEnviados As String
  42.        Get
  43.            Return DatosEnviados
  44.        End Get
  45.        Set(ByVal value As String)
  46.        End Set
  47.    End Property
  48. End Class
  49.  

Y para llamarlo hago lo siguiente:

Código
  1.  
  2. Public Class Form1
  3. Dim Subida As Decimal
  4.    Dim Bajada As Decimal
  5.    Dim OldSubida As Decimal
  6.    Dim OldBajada As Decimal
  7.    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  8.        Dim InfoNet As New InformationNetWork
  9.        InfoNet.EnumerateNetwok()
  10.  
  11.  
  12.        Label4.Text = FormatNumber(((InfoNet.DatesEnviados / 1024 / 1024)), 2) & " MB"
  13.        Label5.Text = FormatNumber(((InfoNet.DatesRecibidos / 1024 / 1024)), 2) & " MB"
  14.        If OldSubida <> Convert.ToDecimal(FormatNumber(((InfoNet.DatesEnviados / 1024 / 1024)), 2)) Then
  15.            Label6.Text = Convert.ToDecimal(FormatNumber(((InfoNet.DatesEnviados / 1024 / 1024)), 2)) + OldSubida & " MB"
  16.            Label7.Text = Convert.ToDecimal(FormatNumber(((InfoNet.DatesRecibidos / 1024 / 1024)), 2)) + OldBajada & " MB"
  17.            Label9.Text = (Convert.ToDecimal(FormatNumber(((InfoNet.DatesEnviados / 1024 / 1024)), 2)) + OldSubida) + _
  18.                (Convert.ToDecimal(FormatNumber(((InfoNet.DatesRecibidos / 1024 / 1024)), 2)) + OldBajada) & " MB"
  19.  
  20.            Subida = Convert.ToDecimal(FormatNumber(((InfoNet.DatesEnviados / 1024 / 1024)), 2)) + OldSubida
  21.            Bajada = Convert.ToDecimal(FormatNumber(((InfoNet.DatesRecibidos / 1024 / 1024)), 2)) + OldBajada
  22.        End If
  23.    End Sub
  24.  
  25. End Class


« Última modificación: 15 Septiembre 2015, 19:34 pm por Lekim » En línea

dato000


Desconectado Desconectado

Mensajes: 3.033



Ver Perfil
Re: No puedo obtener estadística de subida y bajada de red en XP
« Respuesta #1 en: 15 Septiembre 2015, 22:44 pm »

Tal vez en XP no este compilado para la versión de .NET que usa el sistema operativo.



En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: No puedo obtener estadística de subida y bajada de red en XP
« Respuesta #2 en: 16 Septiembre 2015, 00:25 am »

1.
El motivo de que en un equipo te funcione y en otro no, probablemente se deba a que en esta orden asumes que la primera interfáz de todas que se encuentre (0) es la que se debe monitorizar, y eso no siempre tiene por que ser así, ya que otros equipos tendrán varias interfaces o simplemente la primera interfáz encontrada no será la que realmente quieras monitorizar.

Código
  1. '//Estado de red
  2. Dim ipv4Stats As IPv4InterfaceStatistics
  3. ipv4Stats = NetworkInterface.GetAllNetworkInterfaces(0).GetIPv4Statistics

Debes comprobar con evaluaciones qué interfáz es la que realmente quieres monitorizar, empezando por filtrar los adaptadores de Internet y verificar cuales de ellos están activos:
Código
  1. If NetworkInterface.GetIsNetworkAvailable() Then
  2.  
  3.    Dim interfaces As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
  4.  
  5.    For Each ni As NetworkInterface In interfaces
  6.  
  7.        If ni.OperationalStatus = OperationalStatus.Up Then
  8.  
  9.            If (ni.NetworkInterfaceType <> NetworkInterfaceType.Tunnel) AndAlso
  10.               (ni.NetworkInterfaceType <> NetworkInterfaceType.Loopback) Then
  11.  
  12.                Dim statistics As IPv4InterfaceStatistics = ni.GetIPv4Statistics()
  13.  
  14.                If (statistics.BytesReceived > 0) AndAlso (statistics.BytesSent > 0) Then
  15.                    ' En ste punto tenemos una interfáz de red (Internet) activa...
  16.                    ' ...una de varias que pueden haber conectadas y activas al PC.
  17.                End If
  18.  
  19.            End If
  20.  
  21.        End If
  22.  
  23.    Next ni
  24.  
  25. End If
(Si tienes adaptadores "virtuales" de Ethernet cómo por ejemplo TAP-Win podría ser un problema con el código que he mostrado, debes omitir esas interfaces claro está)



2.
La estructuración en general de la Class InformationNetwork es incorrecta, el dato más importante a tener en cuenta es que defines una función EnumerateNetwok sin un valor de retorno asignado, por ende no es una función como tal, y, no se con que intención, devuelves un 0 que no utilizarás en ninguna evaluación posterior.

Por mencionar algo más, esta evaluación es inecesaria (¿con que intención checkeas una conexión TCP establecida?, de esa manera no se verifica si el adaptador está activo, solo si "X" conexión TCP lo está), el casteo es innecesario, el método lambda también, y no especificas el type de la variable declarada:
Citar
Código
  1. Dim n = ipv4Time.GetActiveTcpConnections().Cast(Of System.Net.NetworkInformation.TcpConnectionInformation).First(Function(el) el.State)

Código
  1. Dim state As TcpState = ipv4Time.GetActiveTcpConnections.First.State

En general debes limpiar todo el código de esa y la otra class, añade las declaraciones Option apropiadas y posteriormente corrige todos los errores de compilación que te vas a encontrar debido a los malos hábitos de programación que has aplicado en ambas classes.

Código
  1. Option Explicit On
  2. Option Strict On
  3. Option Infer Off
  4.  
  5. Class
  6. ...
  7. End Class



En resumen, simplemente debes asgurarte de que interfáz quieres monitorizar, y complementariamente sigue también las indicaciones del punto 2. para producir un código limpio y evitar malos hábitos que te causarán otros problemas.

Saludos
« Última modificación: 16 Septiembre 2015, 01:52 am por Eleкtro » En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: No puedo obtener estadística de subida y bajada de red en XP
« Respuesta #3 en: 16 Septiembre 2015, 15:30 pm »

Una alternativa que puedes utilizar serían los contadores de rendimiento.

He desarrollado la siguiente Class que permite monitorizar el tráfico de una interfáz de red, o incluso el tráfico de un proceso, quiero decir del proceso actual o de un ensamblado .Net externo (en ambos casos para monitorizar el tráfico de un proceso primero es necesario habilitar los contadores de rendimiento en el archivo de configuración de la aplicación, "app.config"), con características básicas para controlar el intervalo de actualización y demás, y con algoritmos simples para medir la velocidad de descarga y subida (los he escrito en un par de horas, dan buenos resultados si se asigna un intervalo de actualización de 1 segundo, son muy mejorables pero por el momento lo he dejado así).



Son dos classes distintas, NetworkTrafficMonitor y ProcessTrafficMonitor, en esta demostración hago uso del monitor del tráfico del proceso actual:





Un ejemplo del modo de empleo, el mismo que he utilizado para la app de la imagen GIF:
Código
  1. Imports NetworkUtil
  2. Imports NetworkUtil.NetworkTrafficMonitor
  3.  
  4. Public NotInheritable Class Form1 : Inherits Form
  5.  
  6.    Dim WithEvents procNetMon As NetworkUtil.ProcessTrafficMonitor
  7.  
  8.    Private Sub Form1_Load() Handles MyBase.Load
  9.  
  10.        Me.procNetMon = New ProcessTrafficMonitor(Process.GetCurrentProcess.Id)
  11.        Me.procNetMon.UpdateBehavior = UpdateBehaviorEnum.FireAlwaysAfterTick
  12.        Me.procNetMon.UpdateInterval = 1000 ' 1 sec.
  13.        Me.procNetMon.Start()
  14.  
  15.    End Sub
  16.  
  17.    Private Sub ProcNetMon_TrafficChanged(ByVal sender As Object, ByVal e As ProcessTrafficMonitor.TrafficChangedEventArgs) _
  18.    Handles procNetMon.TrafficChanged
  19.  
  20.        Me.LabelBytesReceived.Text = String.Format("Bytes received: {0} kb", (e.BytesReceived / 1024).ToString("n2"))
  21.        Me.LabelDlSpeed.Text = String.Format("DL Speed: {0} kb/sec", (e.DiffBytesReceived / 1024).ToString("n2"))
  22.  
  23.        Me.LabelBytesSent.Text = String.Format("Bytes sent: {0} kb", (e.BytesSent / 1024).ToString("n2"))
  24.        Me.LabelUlSpeed.Text = String.Format("UL Speed: {0} kb/sec", (e.DiffBytesSent / 1024).ToString("n2"))
  25.  
  26.    End Sub
  27.  
  28.    Private Sub BtDownloadUrl_Click() Handles BtDownloadUrl.Click
  29.  
  30.        Dim url As String = "http://download.thinkbroadband.com/10MB.zip"
  31.        Dim client As New WebClient()
  32.        client.DownloadFileAsync(New Uri(url), Path.GetTempFileName())
  33.  
  34.    End Sub
  35.  
  36.    Private Sub BtPauseMon_Click() Handles BtPauseMon.Click
  37.  
  38.        If Me.procNetMon.IsActive Then
  39.            Me.procNetMon.Stop()
  40.        Else
  41.            Me.procNetMon.Start()
  42.        End If
  43.  
  44.    End Sub
  45.  
  46. End Class

La Class NetworkTrafficMonitor, que es en lo que podrías estar interesado, se maneja exactamente de la misma manera, ya que ProcessTrafficMonitor la heredo de esta;
La única diferencia es el constructor, que toma cómo argumento el nombre de una interfáz de red activa.

Ejemplo:
Código
  1. Dim WithEvents netMon As New NetworkTrafficMonitor(NetworkTrafficMonitor.GetAvaliableInterfaceNames.First)



El código fuente lo puedes descargar aquí, simplemente copiar pegar y utilizar:

Network/Process Traffic Monitor in VBNet, By Elektro - PasteBin

PD: Si usas la class, te sugiero separar las subclasses que hay definidas en varios archivos.



Diagrama de classes:



   

 
 




Espero que les sirva de algo a ti y a los que estén interesados :)

Saludos
« Última modificación: 16 Septiembre 2015, 16:44 pm por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines