Scanneur d'ip

Résolu
Bentouate Messages postés 12 Date d'inscription mercredi 16 septembre 2009 Statut Membre Dernière intervention 16 avril 2011 - 14 avril 2011 à 20:23
pl4hs Messages postés 53 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 26 avril 2011 - 14 avril 2011 à 21:16
Bonjour ! :)

J'ai hésité à poster ce post dans réseau & internet ... j'espere que je me suis pas trompé ^^'

Mon objectif : créer une application qui est capable de scanner un plage d'adresse IP.

Mon objectif est atteint ... le seul problème c'est que le programme prend énormément de temps à scanner :s

        private void BT_SCAN_Click(object sender, EventArgs e)
        {
            int i 0, nbrIP 0;
            string IP;
            char classeIP;
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();

            options.DontFragment = true;

            String data = new String('a', 32);
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 0;

            // le caractére qui va servir de séparateur:
            char[] Caract_Separateur = new Char[] { '.' };

            // séparation de la chaine.
            string[] IpDeb = TB_DEB_IP.Text.Split(Caract_Separateur, 100);
            string[] IpFin = TB_FIN_IP.Text.Split(Caract_Separateur, 100);

            nbrIP = nbrAdresse(IpDeb, IpFin, out classeIP);

            if (nbrIP != 0)
            {
                while (i < 20) // pour essayer
                {
                    IP = incrementIP(classeIP, ref IpDeb, ref IpFin);

                    IPHostEntry entry = Dns.GetHostEntry(IP);
                    PingReply reply = pingSender.Send(entry.AddressList[0], timeout, buffer, options);
                    LIB_SCAN2.Items.Add(IP).SubItems.Add(reply.RoundtripTime.ToString() + " ms");
                    i++;
                }
            }
            else
            {
                MessageBox.Show("Adresse IP non valide !");
                TB_DEB_IP.Text = "";
                TB_FIN_IP.Text = "";
            }

            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LIB_SCAN2.View = View.Details;
            LIB_SCAN2.Columns.Add("Adresse IP", LIB_SCAN2.Width / 3);
            LIB_SCAN2.Columns.Add("Temp", LIB_SCAN2.Width / 3);
            LIB_SCAN2.Columns.Add("Resultat", LIB_SCAN2.Width / 4);
        }

        public static int nbrAdresse(string[] IpDeb, string[] IpFin, out char classeIP)
        {
            int nbrAddr = 0;
            int Octet1Deb, Octet2Deb, Octet3Deb, Octet4Deb; // Octets de l'adresse ip début.
            int Octet2Fin, Octet3Fin, Octet4Fin; // Octets de l'adresse ip fin.

            Octet1Deb = Int32.Parse((IpDeb[0]));
            Octet2Deb = Int32.Parse((IpDeb[1]));
            Octet3Deb = Int32.Parse((IpDeb[2]));
            Octet4Deb = Int32.Parse((IpDeb[3]));

            Octet2Fin = Int32.Parse((IpFin[1]));
            Octet3Fin = Int32.Parse((IpFin[2]));
            Octet4Fin = Int32.Parse((IpFin[3]));

            if (Octet1Deb < 127)
            {

                nbrAddr = (int)Math.Pow(2, 24);
                classeIP = 'A';
            }
            else
            {
                if (Octet1Deb < 192)
                {
                    nbrAddr = (int)Math.Pow(2, 16);
                    classeIP = 'B';
                }
                else
                {
                    nbrAddr = (int)Math.Pow(2, 8);
                    classeIP = 'C';
                }
            }


            return nbrAddr;
        }

        public static string incrementIP(char classeIP, ref string[] IpDeb, ref string[] IpFin)
        {
            string IP = null;
            int Octet1Deb, Octet2Deb, Octet3Deb, Octet4Deb; // Octets de l'adresse ip début.
            int Octet2Fin, Octet3Fin, Octet4Fin; // Octets de l'adresse ip fin.

            Octet1Deb = Int32.Parse((IpDeb[0]));
            Octet2Deb = Int32.Parse((IpDeb[1]));
            Octet3Deb = Int32.Parse((IpDeb[2]));
            Octet4Deb = Int32.Parse((IpDeb[3]));

            Octet2Fin = Int32.Parse((IpFin[1]));
            Octet3Fin = Int32.Parse((IpFin[2]));
            Octet4Fin = Int32.Parse((IpFin[3]));

            if (classeIP == 'A')
            {
                
            }
            else
            {
                if (classeIP == 'B')
                {

                }
                else
                {
                    Octet4Deb = Octet4Deb + 1;
                    IpDeb[3] = Octet4Deb.ToString();
                    IP = Octet1Deb +"."+ Octet2Deb +"."+ Octet3Deb +"."+ Octet4Deb;
                }
            }
            return IP;
        }
       
    }


Le programme est loin d'être finnis ... il fonctionne uniquement pour une adresse IP de classe C.

Ma question : Est ce qu'il y aurait une solution à mon problème d'execution ? Il y a une solution plus simple et plus efficace que mon code ? ^^

Merci d'avance !

6 réponses

pl4hs Messages postés 53 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 26 avril 2011
14 avril 2011 à 21:07
Je ne vais pas rep correctement a ta question car je sais pas trop et je veu pas dire de betise..

Mais je peux te donner 2/3 ptit conseil et tu en fait cke tu veu

Tout d'abord, pourquoi ne fait tu pas un "Switch" plutot que tout ces if else..?

switch(classIP)
{
   case 'A' :
      break;
   case 'B' :
      break;
   case 'C' :
               Octet4Deb = Octet4Deb + 1;
               IpDeb[3] = Octet4Deb.ToString();
               IP = Octet1Deb +"."+ Octet2Deb +"."+ Octet3Deb +"."+ Octet4Deb;
      break;
}


Ensuite ton "while", remplace le par un "for vu que tu l’incrémente toi même.
for(int i = "?"; i<20 ; i++)
{
   //Ton code....
}
//Qui est mieu que:
while(i<20)
{
//ton code..
i++
}


Evite de taper ton code direct dans ton évenement..
 private void BT_SCAN_Click(object sender, EventArgs e)
{
   Scan();
}

void scan()
{
int i 0, nbrIP 0;
string IP;
char classeIP;......
}

//Plus propres, possibilite de mettre dans une "DLL" et d'etre apeller de n'importe quel controle


Et moi sinn pour essayer de gagner du temps, jexecuterai toutes les actions en mm temps dans un thread de chaque..sa bouffe de la ressource mais je pence que tu vas gagner du temps..

a tester
3
pl4hs Messages postés 53 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 26 avril 2011
14 avril 2011 à 21:11
PS: pour les threads c'est la et la..
3
pl4hs Messages postés 53 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 26 avril 2011
14 avril 2011 à 20:33
salut,

tu n'as pas trops expliquer ton problème la..

C'est long certes, sa dépend de ta connexion, de celle des ip scanner etc etc..

Si c'est parce que ton prog a l'air de planter, t que tu voudrai fair autres chose en attendanta tu le met dans un thread a pars..
0
Bentouate Messages postés 12 Date d'inscription mercredi 16 septembre 2009 Statut Membre Dernière intervention 16 avril 2011
14 avril 2011 à 20:46
Re,

tu n'as pas trops expliquer ton problème la..


En faite je me demandais si il y avait pas une méthode plus simple que ce que j'ai fais. Par exemple un bout de code
qui me permettrait de scanner une plage d'adresse au lieu de faire une boucle While... (en tout cas j'ai rien trouvé sur ça :s)

C'est long certes, sa dépend de ta connexion, de celle des ip scanner etc etc..


Le problème c'est que quand l'adresse ip est attribuée à aucun poste, il prend du temps pour s'en rendre compte et passé à l'ip suivante...
J'ai beau changé la valeur du timeout ça change pas grand chose ...

Si c'est parce que ton prog a l'air de planter, t que tu voudrai fair autres chose en attendanta tu le met dans un thread a pars..


J'ai pas compris :s

En tout cas merci d'avoir pris le temps de lire ! ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bentouate Messages postés 12 Date d'inscription mercredi 16 septembre 2009 Statut Membre Dernière intervention 16 avril 2011
14 avril 2011 à 21:14
Merci pour t'es conseil c'est sympa de ta part ! :)

Je vais regarder l'histoire des threads... je connais pas vraiment, c'est l'occasion de s'y mettre


Encore Merci ! ;)
0
pl4hs Messages postés 53 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 26 avril 2011
14 avril 2011 à 21:16
Pas de probleme si tu as besoin tu c'est ou allez

Bon courage a toi..
0
Rejoignez-nous