Bug sur un code [Résolu]

Signaler
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
-
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
-
Bonjour je cherche à faire une classe mais j'ai un code qui bug :
Procedure TIPv4.SaveToFileOptimize(FileName:String);
{Enregistre dans le format le plus court
Format (127.0.0.1) :
[SM]Simple(127.0.0.1)->127.0.0.1:Codage standard sans simplification
[S0]Supp0(127.0.0.1)->127...1:Supression des 0
[NP]NoPoint(255.255.255.255)->255255255255:Supprime les points (uniquement si chaque Octect > 99)
[NM]Name(127.0.0.1)->me:Transforme en nom si possible}
Var
Temp:TStrings;
Supp0:ShortString;
NoPoint:ShortString;
Name:ShortString;
Begin
//Préparation
Temp := TStrings.Create;//Initialisation de Temp
//Application des algorithme
  //Supp0
  If FByte1 = 0 Then//Simplique du 1er octect possible?
    Supp0 := '.'
  Else Supp0 := IntToStr(FByte1)+'.';
  If FByte2 = 0 Then//Simplique du 2e octect possible?
    Supp0 := Supp0 + '.'
  Else Supp0 := Supp0 + IntToStr(FByte2)+'.';
  If FByte3 = 0 Then//Simplique du 3e octect possible?
    Supp0 := Supp0 + '.'
  Else Supp0 := Supp0 + IntToStr(FByte3)+'.';
  If FByte4 = 0 Then//Simplique du 4e octect possible?
  Else Supp0 := Supp0 + IntToStr(FByte4);
  //NoPoint
  If (FByte1 > 99) and (FByte2 > 99) and (FByte3 > 99) and (FByte4 > 99) Then
    NoPoint := GetIP('')
  Else NoPoint := GetIP;
  //Name
  NoPoint := GetIP;
  If GetIP = '127.0.0.1' Then
    NoPoint := GetIP('me');
  If GetIP = '255.255.255.255' Then
    NoPoint := GetIP('+');
  If GetIP = '0.0.0.0' Then
    NoPoint := GetIP('-');
  If GetIP = '192.168.1.1' Then
    NoPoint := GetIP('nat1');
  If GetIP = '192.168.0.1' Then
    NoPoint := GetIP('nat0');
  If GetIP = '255.255.255.0' Then
    NoPoint := GetIP('nat');
//Recherche de l'algorithme le plus court
Temp.Text := 'SM' + GetIP;//Simple
 If Length(Supp0) < Length(Temp.Text) Then//Supp0
   Begin
     Temp.Text := 'S0' + Supp0;
   end;
 If Length(NoPoint) < Length(Temp.Text) Then//NoPoint
   Begin
     Temp.Text := 'NP' + NoPoint;
   end;
 If Length(Name) < Length(Temp.Text) Then//Name
   Begin
     Temp.Text := 'NM' + Name;
   end;
//Enregistrement
Temp.SaveToFile(FileName);
end;


Temp.Text := 'SM' + GetIP;
(ligne 48) fait une erreur abstraite (je suis sérieux). Fbyte1, Fbyte2, Fbyte3 et Fbyte4 sont des Byte. GetIP renvoie 127.127.127.127.

Ce code enregistre un IP dans le format le plus court d'après 3 algorithmes différent. Ensuite le code choisit le plus adapter.

Merci de votre aide.

3 réponses

Messages postés
400
Date d'inscription
samedi 6 août 2005
Statut
Membre
Dernière intervention
11 février 2016
1
Malheureusement en l'état actuel on ne peut pas tester ton code puisqu'il manque des variables globales dont tu nous donnes pas le type.

Ceci dit quelques remarques en vrac :

-Je crois que tu as mal lu la définition du type ShortString qui est inutile dans ton cas et devenu obsolète avec les dernières versions de delphi (Utilisation de l'unicode).

-On utilise dans la mesure du possible jamais de variables globales. Au pire on réalise une fonction si on a besoin de récupérer un résultat.

-Arrêtte avec ces transtypages systématiques : Ton code est déjà lent à la base, n'en rajoute pas une couche ;).

-Ton code n'est pas optimisé ni en terme d'écriture (Il y a plus simple et plus beau) ni en terme d'execution.
Messages postés
3820
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
1 décembre 2020
113
Puis-je rigoler à mon tour ? Il existe un outil réputé sous Unix (porté aussi sous Windows), qui s'appelle "nmap". C'est généralement avec ça qu'on travaille.

Voici les perfs sur un "Pentium(R) Dual-Core CPU E5300 @ 2.60GHz":
Exemple:

255 ips: "nmap -sP 10.0.10.1-255" => 7.62 seconds (et il a découvert 6 hosts up sur mon réseau)
65025 ips: "nmap -sP 10.0.1-255.1-255" => 72.41 seconds (et il a découvert 9 hosts up sur mon réseau) (soit ~890 ip par seconde, soit environ 1.2 ms par ip).

C'est bien de bidouiller un tel outil, mais pour de bonnes perfs, mieux vaut utiliser ce qui existe déjà dans le milieu depuis des années...
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
rmet de voir les connections sur un ordi (intéressant quand même), mais cptpingu tu l'utilise pour faire des pings (nmap -sP 0-255.0-255.0-255.0-255 permettrait de pinger la planète si j'ai compris sa syntaxe)
Messages postés
3820
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
1 décembre 2020
113
nmap -sP 0-255.0-255.0-255.0-255 ping effectivement toute la plage ipv4.
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
Puis-je rigoler à mon tour ? Il existe un outil réputé sous Unix (porté aussi sous Windows), qui s'appelle "nmap". C'est généralement avec ça qu'on travaille.

ouai mais on s'éloigne du sujet !!!

ici on parle de code PRODUIT soit même et non d'outils externes !!!
et je sais que MiniApp et moi utilisons le même code à la base ...
ensuite on peut constater que l'outil en question ne fait pas mieux que mon code question perfs pour 256 pings et je limite mon code à 50 Threads fonctionnant simultanément

ensuite pour les 65025 IPs les chiffres me laisse dubitatif !!!
pour 255 IP tu mets 7 sec ==> ~ 33 IP/sec
pour 65025 tu mets 72 sec ==> ~ 898 IP/sec

n'y a-t-il pas une erreur de virgule dans tes chiffres ?
Messages postés
3820
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
1 décembre 2020
113
Il n'y a pas d'erreur, non. Je n'ai pas regardé le code de nmap. Peut être adapte-t-il le nombre de thread à la grandeur de la plage ou saute-t-il des plages "inutiles".
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
J'ai résolu mon problème,

J'ai regarder l'aide de TStringList et j'ai vu que TStringsList avait son propre Add, alors j'ai remplacer mon TStrings par TStringsList ce qui a marcher. Le problème ensuite c'est que le test pour savoir quelle chaines est la plus courtes était érronée, alors j'ai fait une variables temp qui est un String et que j'utilise pour trouver la chaine la plus courtes que je rentre dans TStringList.
Le code final :
Procedure TIPv4.SaveToFileOptimize(FileName:String);
{Enregistre dans le format le plus court
Format (127.0.0.1) :
[SM]Simple(127.0.0.1)->127.0.0.1:Codage standard sans simplification
[S0]Supp0(127.0.0.1)->127...1:Supression des 0
[NP]NoPoint(255.255.255.255)->255255255255:Supprime les points (uniquement si chaque Octect > 99)
[NM]Name(127.0.0.1)->me:Transforme en nom si possible}
Var
Temp:String;
Strings:TStringList;
Supp0:String;
NoPoint:String;
Name:String;
Begin
//Préparation
Strings := TStringList.Create;//Initialisation de Strings
//Application des algorithme
  //Supp0
  If FByte1 = 0 Then//Simplique du 1er octect possible?
    Supp0 := '.'
  Else Supp0 := IntToStr(FByte1)+'.';
  If FByte2 = 0 Then//Simplique du 2e octect possible?
    Supp0 := Supp0 + '.'
  Else Supp0 := Supp0 + IntToStr(FByte2)+'.';
  If FByte3 = 0 Then//Simplique du 3e octect possible?
    Supp0 := Supp0 + '.'
  Else Supp0 := Supp0 + IntToStr(FByte3)+'.';
  If FByte4 = 0 Then//Simplique du 4e octect possible?
  Else Supp0 := Supp0 + IntToStr(FByte4);
  //NoPoint
  If (FByte1 > 99) and (FByte2 > 99) and (FByte3 > 99) and (FByte4 > 99) Then
    NoPoint := GetIP('')
  Else NoPoint := GetIP;
  //Name
  Name := '255.255.255.2550';
  If GetIP = '127.0.0.1' Then
    Name := 'me';
  If GetIP = '255.255.255.255' Then
    Name := '+';
  If GetIP = '0.0.0.0' Then
    Name := '-';
  If GetIP = '192.168.1.1' Then
    Name := 'nat1';
  If GetIP = '192.168.0.1' Then
    Name := 'nat0';
//Recherche de l'algorithme le plus court
Temp := 'SM' + GetIP;//Simple
 If Length(Supp0) < Length(Temp) Then//Supp0
   Begin
     Temp := 'S0' + Supp0;
   end;
 If Length(NoPoint) < Length(Temp) Then//NoPoint
   Begin
     Temp := 'NP' + NoPoint;
   end;
 If Length(Name) < Length(Temp) Then//Name
   Begin
     Temp := 'NM' + Name;
   end;
//Enregistrement
Strings.Text := Temp;
Strings.SaveToFile(FileName);
end;


L'encodeur marche.

Chercher et essayer : vous trouverez la solution!
Fouiner et regarder partout : vous trouverez la connaissance!!
Messages postés
400
Date d'inscription
samedi 6 août 2005
Statut
Membre
Dernière intervention
11 février 2016
1
Sauf que tu ne libères toujours pas ton Strings et que l'utilisation d'un try except est plus que conseillé.

CptPingu : Si MiniApp veut juste un logiciel pour pinger effectivement autant l'orienter vers un truc existant, après si son objectif est de le faire lui même autant ne pas lui priver de ce plaisir :).

Cirec : Il est possible que le nombre de threads lancé par cette application dépend du nombre d'ip à scanner, d'ou la fausse anomalie que tu indiques :). Par contre pourrais tu juste faire les même essais que CptPingu au niveau du nombre d'ip pinger en utilisant non 50 threads mais 200 juste pour voir ce que cela donne : Je suis assez curieux du résultat ;).
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
Merci pour le TStringList, je vais mettre un try finally
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
ben en fait j'avais aussi testé cette partie et peu importe le type de processeur
le code limité à 256 Threads est ~1sec plus long qu'avec 50 Threads

et dans les deux cas (XP et Seven) l'os ne laisse pas créer autant de Threads(256) simultanément
le système semble les retenir les mettre en attente !!! (~160 - 170 Max)

justement c'est pour cela que ça m'étonne un peu ... en plus chaque réponse prend ~40ms ce sont donc des limites physiques que l'on approche tout doucement ... après cet outil n'utilise certainement pas la méthode que la notre ... la quelle il faut le rappeler avait pour but de départ de faire 1 Ping sans utiliser Indy ou autre composant tiers ... on est donc parti sur une commande Dos, un simple Ping !

... je reste donc dubitatif ^^

    
@+ Cirec
Messages postés
400
Date d'inscription
samedi 6 août 2005
Statut
Membre
Dernière intervention
11 février 2016
1
On peut se passer du dos (shell) et je me demande même si en terme de perfs si cela ne serait pas mieux du reste et j'en serai pas étonné.

Merci pour le retour de tests : Justement j'attendais la conclusion que tu nous a donné soit une limitation du nombre de threads actifs par l'Os (Voir les mots précédents de MiniApp sur la possibilité d'utiliser un nombre conséquents de threads).
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
Pour ajuster la consomation de l'application j'ai trouver ceci. Et j'ai même réussi à le compiler dans mon Delphi 5 ! Une modification du code-source peut faire un smart programme.
Messages postés
400
Date d'inscription
samedi 6 août 2005
Statut
Membre
Dernière intervention
11 février 2016
1
Ca ne permet pas d'ajuster mais simplement d'évaluer les ressources utilisées par ton source : Ceci dit il existe des applications externes qui te permettent la même chose, ce qui est nettement plus pratique, et de façon plus détaillée.
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
Je parlait de l'intégrer à un programme.