none
Como hacer un formulario que escanee direcciones ip en C# RRS feed

  • Pregunta

  • Quiero hacer un simulador de direccionamientos de red como el ejemplo siguiente:

    monitoreo

    icono verde signifique que esta encendida y el rojo que esta apagada. Cuando oprima un botón (Button) empieze a mostar las direcciones ip y su mac. 

    por ejemplo: en el código del formulario darle un rango de direccionamiento de inicio y final. (192.168.1.0 a la 192.168.1.25)

    Saludos.


    JavierLg12

    jueves, 4 de enero de 2018 4:30

Todas las respuestas

  • Usa un bucle que vaya construyendo las direcciones incrementando el número entre los valores deseados. Por cada dirección, intenta establecer una conexión de cualquier tipo a esa dirección. Por ejemplo, puedes hacer un "ping", pero si no quieres complicarte, también vale con intentar abrir un fichero tal como \\direccionIP\loquesea, cosa que por supuesto fallará, pero puedes despreciar el error porque no te interesa el fichero, lo único que te interesa es que Windows resuelva la dirección MAC.

    Una vez hecho eso, lee la tabla de ARP. Puede que haya alguna API para eso, pero yo lo que hago es usar Process.Start para lanzar el comando "ARP -a". Eso te devuelve la lista de direcciones IP con su correspondiente MAC. Las direcciones que no aparezcan en esa lista no han respondido, por lo que puedes marcarlas en rojo.

    OJO: Esto solo funciona dentro de tu misma red local. No puedes leer las direcciones MAC en otra subred, ya que la MAC no se propaga a través de los routers.

    jueves, 4 de enero de 2018 9:12
  • Buen dia Alberto Poblacion

    Claro es dentro de una red local 

    Busco como implementarlo con codigo c#

     private void Scan(string ip)
        {
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            SocketAsyncEventArgs e = new SocketAsyncEventArgs();
            e.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
            e.UserToken = s;
            e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);
            list.Add(e);   
            s.ConnectAsync(e);
        }
     

    JavierLg12

    viernes, 5 de enero de 2018 4:25
  • Observa que con ese código estás abriendo una conexión a un puerto concreto. Eso solo funcionará si el equipo de destino está escuchando en ese puerto y si no está cerrado en su cortafuegos. Por eso yo te proponía usar la tabla de ARP, que siempre funciona si el equipo está encendido, con independencia de que esté o no esté escuchando en un determinado puerto o de su configuración de firewall.

    Lo que sí puedes hacer es ejecutar en un bucle ese mismo código que has mostrado cambiando la ip para que cubra todo tu rango a escanear, y cuando haya terminado (con independencia de que consiga o no consiga establecer la conexión a port), entonces lees la tabla de ARP y ahí verás cuáles son los equipos que están "vivos" (y además obtendrás su dirección MAC).

    viernes, 5 de enero de 2018 8:50
  • No he podido lograrlo...

    Ayuda para realizarlo en c# 

    alguna idea o algun ejemplo, link de ayuda 

    saludos espero sus ayudas 


    JavierLg12

    sábado, 13 de enero de 2018 15:31

  • Hola, lograste hacerlo, no puedo y ya llevo mas de un mes :/
    martes, 11 de septiembre de 2018 22:53
  • HOLA BUEN DIA A TODOS...

    ¿COMO PUEDO HACER PARA QUE DEPENDIENDO DEL ESTADO DE LA IP ME MUESTRE EN UNA COLUMNA DE MI DATAGRIDVIEW, LA IMAGEN COMO EN EL EJEMPLO SEA MOSTRADO?

    YA LO HICE EN LISTVIEW PERO LO REQUIERO PASAR A UN DATAGRIDVIEW, ALGUIEN QUE ME PUEDA AYUDAR??

    public partial class Form1 : Form
        {
            private List<String> m_ipAdresses;
    
    public Form1() //// Constructor por defecto
            {
                InitializeComponent();
                m_ipAdresses = new List<String>();
    
            }
    
    /// <summary>
            /// Método que inicia el proceso de monitoreo a partir de una lista de ip's.
            /// </summary>
            /// <param name="addresses">Lista de Strings(ip's)</param>
    
    
            public void Check(List<string> addresses) 
            {
                List<Task<PingResult>> pingTasks = new List<Task<PingResult>>(); /// Lista de respuestas de los pings de las ip's contenidas en lista adresses.
    
                //// ciclo para recorrer la lista de ip's y hacer ping a cada una; el resultado del ping se almacena en un dato de tipo PingResult y se agrega a la lista pingTasks.
                foreach (string address in addresses)
                {
                    pingTasks.Add(PingAsync(address));
                }
    
                /// bloque de codigo para análisar el resultado de todos los pings.
    
                Task.Factory.ContinueWhenAll(pingTasks.ToArray(), _ => { }).ContinueWith(t =>
                {
                    StringBuilder pingResult = new StringBuilder();
                    foreach (var pingTask in pingTasks)
                    {
                        ListViewItem ip = listView1.FindItemWithText(pingTask.Result.Address.ToString());
                        if (ip != null)
                        {
                            ip.ImageIndex = pingTask.Result.Reply.Status == IPStatus.Success ? 0 : 1;
                        }
                        else
                        {
                            ListViewItem item1 = new ListViewItem("", pingTask.Result.Reply.Status == IPStatus.Success ? 0 : 1);
                            item1.SubItems.Add(pingTask.Result.Address.ToString());
                            listView1.Items.Add(item1);
                        }
                    }
                    Console.WriteLine(pingResult.ToString());
                },
                CancellationToken.None,
                TaskContinuationOptions.None,
                TaskScheduler.FromCurrentSynchronizationContext());
    
            }
        }

    LO REMARCADO  ES LO QUE USE EN EL LISTVIEW.

    SALUDOS.


    JavierLg12


    jueves, 1 de noviembre de 2018 17:12
  • Buen dia 

    Alguien que me pueda ayudar?


    JavierLg12

    miércoles, 7 de noviembre de 2018 16:02