mercoledì 14 gennaio 2015

IP SCANNER FAI DA TE (DOTNET)

Spesso colleghiamo un hardware ad una rete in DHCP, come fare a riconoscere al volo l'indirizzo IP automaticamente assegnato? Scopriamo insieme come realizzare un IP Scanner fai-da-te in C#.


IP Scanner

Un IP Scanner è un software che, a seconda del proprio indirizzo IP, cerca tutti gli indirizzi IP raggiungibili. Esistono molti prodotti di questo tipo in commercio, alcuni free altri a pagamento. Lo scopo di questo articolo è bypassare completamente la ricerca o l'installazione di un software preferendo un approccio fai-da-te per sviluppare da soli quei semplici tools quotidiani che possono sempre essere utili.

Linguaggio di programmazione

La scelta del linguaggio C# rispetto al Java (maggiormente utilizzato su Programmazione Applicata) ricade su come i due linguaggi fanno la stessa cosa, mi riferisco all'effettuazione del comando PING. Tutti almeno una volta nella vita abbiamo utilizzato questo comando da riga di comando per testare la comunicazione con un indirizzo IP. Il problema è che Java, a seconda del Sistema Operativo in uso, potrebbe non avere i diritti per effettuare il ping (provare per credere). 

Analisi del problema

Analizziamo il problema: 
  • Di cosa abbiamo bisogno? di trovare gli indirizzi IP della rete
  • Cosa abbiamo a disposizione? uno o più indirizzi assegnate alla propria macchina.
Avendo a disposizione l'indirizzo IP della propria macchina, trovare quelli raggiungibili dalla rete è un gioco da ragazzi. Sappiamo che un Indirizzo IP (versione 4) è formato da quattro numeri da 0 a 255. Supponendo che la maschera di sotto rete in uso sia 255.255.255.0 e che l'indirizzo IP della macchina sia 192.168.1.10, il nostro software dovrà scandire la rete alla ricerca degli indirizzi compresi dall'intervallo 192.168.1.0 e 192.168.1.255.

Implementazione

Vediamo come implementare questa semplicissima logica attraverso il linguaggio C#:

using System;
using System.Text;
using System.Net.NetworkInformation;
using System.Net;
using System.Collections.Generic;

namespace org.dgl.ipscan
{
    class Program
    {

        const int DEFAULT_TIMEOUT = 1000;

        static void Main(string[] args)
        {
            IPAddress[] addresses;
            String ip;
            String[] ipSections;
            Ping pinger;
            PingReply reply;
            Console.WriteLine("start scanning...");
            addresses = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
            foreach (IPAddress a in addresses)
            {
                ip = a.ToString();
                if (ip.Length > 15) continue;
                ipSections = ip.Split('.');
                for (int i = 0; i < 256; i++)
                {
                    ip = ipSections[0] + "." + ipSections[1] + "." + ipSections[2] + "." + i;
                    pinger = new Ping();
                    reply = pinger.Send(ip, DEFAULT_TIMEOUT);
                    if (reply.Status == IPStatus.Success) Console.WriteLine(ip + " is reachable");
                }
            }
            Console.WriteLine("scan completed");
            Console.ReadKey();
        }

    }
}

Dal codice appena proposto, analizziamo le parti fondamentali:

  • attraverso Dns.GetHostEntry(Dns.GetHostName()).AddressList possiamo avere un array degli indirizzi IP della macchina
  • per ogni indirizzo IP della macchina viene effettuato un parsing della rete andando a sostituire il quarto numero dell'indirizzo IP
  • attraverso la classe System.Net.Ping viene effettuato un send di pacchetti e verificata la comunicazione entro un timeout impostato ad 1 secondo.

Conclusione


Torniamo al problema principale: Come si fa a capire l'indirizzo IP di un hardware appena collegato ad una rete DHCP? La risposta è molto semplice: eseguite il programma di IP Scanning prima di collegare e dopo averlo collegato, vedremo che un indirizzo comparirà solo nella seconda esecuzione e sarà quello desiderato.

Nessun commento:

Posta un commento