X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013
-
14 août 2009 à 12:22
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013
-
7 oct. 2009 à 18:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 7 oct. 2009 à 18:10
Quel naze je fais :/ C'est corrigé ! Merci
En gros, j'avais oublié que preg_match reproduisait la chaine en case 0, quand j'ai codé le constructeur... ce qui était sioux, c'est que je m'en suis rappelé dans le reste du code :/
Je pense toujours au /31 et /32... mais après le manque de temps, la bronchite... le destin s'acharne :)
faischiermarredecreerdescomptesp
Messages postés1Date d'inscriptionlundi 31 août 2009StatutMembreDernière intervention 7 octobre 2009 7 oct. 2009 à 16:26
J'ai tenté d'utiliser cette classe... cependant elle a du mal avec les notations quad dotted visiblement...
Je lui fourni une ip 10.10.10.10 avec un masque de 255.255.0.0 et j'ai un beau network à 10.10.10.0 (!)
<?php
require('IP4Calc.class.php');
$oIP = new IP4Calc("10.10.10.10", "255.255.0.0");
$network=$oIP->get(IP4Calc::NETWORK, IP4Calc::QUAD_DOTTED);
$broadcast=$oIP->get(IP4Calc::BROADCAST, IP4Calc::QUAD_DOTTED);
echo "Le net serait ".$network;
echo "\nLa diff. serait ".$broadcast;
?>
php test.php
Le net serait 10.10.10.0
La diff. serait 10.10.10.255
La bonne réponse est : 10.10.0.0 et 10.10.255.255
code à revoir...
:)
MrJAY42
Messages postés5Date d'inscriptionmardi 23 novembre 2004StatutMembreDernière intervention 6 janvier 2012 13 sept. 2009 à 12:30
Ok.
C'est donc une justification esthétique et pratique.
Et pardon, j'ai lu un peu trop rapidement le code, en effet les constantes servent d'index dans le tableau "général".
Merci pour ton explication
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 13 sept. 2009 à 11:34
Bonjour,
Désolé, je suis encore sous l'eau en ce moment... mais promis, je pense à corriger le bug des /31 et /32. Je ne vois pas d'autre solution que de faire un hack bien moche "if /31 then" :o/ Cela dit, en lisant la RFC, elle est issue elle-même d'un vieux hack des spécifications des masques :)
Pour répondre à ta question MrJay42, et bien, heu... en fait faudrait déjà que je comprenne :P Je ne modifie pas mes constantes dans le constructeur.
En fait, à l'aide de mes constantes (vraies constantes, j'entends), j'initialise des tableaux. Pourquoi faire ? Pour "cacher" la réponse des calculs. Mettons que tu demandes plusieurs fois la même information, celle ci est cachée, et j'économise les qq microsecondes de calcul... Bon j'avoue, ca doit représenter que dalle, mais je préfère gaspiller un peu de mémoire, le temps que l'objet existe, plutôt que refaire des calculs déjà faits.
Ensuite, j'ai utilisé un tableau, plutôt que des variables sépérarées, pour compacter un peu le code, sans trop le complexifier. J'aurai pu faire un tableau par information (pour le cache), et faire un get par données avec le format en paramètre, il est vrai. C'est juste que c'était plus long à écrire, et assez répétitif, à base de nombreux copier/coller peu intéressants et donc source d'erreur.
Tant que ca reste comprehensible, moins il y a de lignes, moins il y a de bugs possibles :p
MrJAY42
Messages postés5Date d'inscriptionmardi 23 novembre 2004StatutMembreDernière intervention 6 janvier 2012 13 sept. 2009 à 10:32
Hello,
Mais j'ai une question qui peut sembler "bête" :
Pourquoi ? :
Pourquoi tout mettre dans des constantes ? Qui sont modifiées dans le constructeur...
Pourquoi mettre toutes ces constantes dans un tableau ?
Pourquoi ne pas gérer la classe avec des attributs en private avec des get() et des set()...old school pour ainsi dire...
En tout cas merci pour cette classe qui peut être carrément utile :)
Ciao
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 3 sept. 2009 à 12:23
Je suis un peu sous l'eau, en ce moment ; je corrige dès que je peux. Désolé pour ce délai.
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 1 sept. 2009 à 10:55
Ah ! Je ne savais pas. Ce matin, j'ai rapidement lu autour du sujet et vu que c'était rarement usité, et souvent décrié ; mais tu as raison, s'il y a une RFC, je me dois de le supporter. Je corrige ça dans la journée, il faut que je regarde comment je vais gérer ça proprement.
Merci beaucoup pour tes remarques.
megavolts
Messages postés2Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 1 septembre 2009 1 sept. 2009 à 08:57
Le /31 correspond a un lien PtP RFC 3021, dans cette notation il n'existe plus de network ni de brodcast, ces 2 IP sont directement utilisable comme MIN_HOST et MAX_HOST.
Pour l'instant j'ai rajouter un controle pour utiliser le MAX_HOST a la place du MIN_HOST lorsque le masques est en /31
Pour info ipcalc le gère ;-)
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 1 sept. 2009 à 08:30
Merci pour ce commentaire Megavolts.
Je crois que le bug réside plutôt dans l'acceptation de masques supérieurs à 30, car un /31 ne contient pas d'hôtes du tout, juste un réseau et un broadcast et un /32 ne contient pas du tout de notion de réseau. Je devrais donc abaisser ma limite dans le constructeur à 30. Qu'en penses tu ?
megavolts
Messages postés2Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention 1 septembre 2009 31 août 2009 à 23:43
Genial, exactement ce que je cherchais pour finir une applis réseau.
Cependant un petit bug du a la méthode utilisée: le calcul du MIN_HOST et MAX_HOST avec un subnet en /31 inverse les résultats.
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 27 août 2009 à 23:48
Bonjour,
Il ne s'agit pas de fonctions inutiles mais de wrappers qui n'ont pas d'autres actions que d'uniformiser le nommage des fonctions (ce qui, pour troller un peu, est rare pour les fonctions internes de PHP =)). Une utilité notoire est ainsi de pouvoir retenir plus facilement les noms des fonctions et de pouvoir exécuter les fonctions en générant leurs noms dans une chaine de caractères via les constantes de type, comme je le fais dans la fonction get. Sans cela, j'aurai pu m'en sortir avec un switch, mais je trouvais cela moins élégant.
Jayadeva
Messages postés67Date d'inscriptionmercredi 2 juillet 2003StatutMembreDernière intervention 1 septembre 2008 27 août 2009 à 22:28
Heh, pourquoi t'a des fonctions inutiles ?
Comme :
# static public function convertBinToInt32($sBin) {
# return bindec($sBin);
# }
jon1316
Messages postés2Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention19 août 2009 19 août 2009 à 00:38
Y a pas de quoi
Ce message est destiné à mettre une note ><
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 18 août 2009 à 08:43
Hum... après tant d'éloges, ca va être compliqué de le dire ainsi, mais... si je n'ai pas fait mes déclarations ainsi, c'est tout simplement que j'ignorais qu'une telle syntaxe existait, mais je souhaitais qu'elle existe justement... je sais pas comment j'ai fait mon compte pour passer à coté sur google quand je l'ai cherchée :p
Je corrige ça dans l'après midi.
Merci beaucoup pour cette remarque.
jon1316
Messages postés2Date d'inscriptionmercredi 13 février 2008StatutMembreDernière intervention19 août 2009 18 août 2009 à 04:37
J'aurais juste une remarqua à propos des constantes (c'est le seul truc qui m'a choqué ^^), pourquoi ne pas les mettre dans la classes ?
Sinon très bonne source, je la garde sous le coude ;)
simonviei
Messages postés17Date d'inscriptionjeudi 13 avril 2006StatutMembreDernière intervention 1 décembre 2008 17 août 2009 à 10:13
Cette class très intéressante pour d'une part son utilité et puis parce qu'elle me semble bien écrite.
:)
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 17 août 2009 à 09:00
Merci :) Disons que ca fait plaisir d'avoir au moins un retour positif, voire un retour tout court ;) Malgré que je programme en PHP depuis plusieurs années (alors que ce n'est pas mon métier... je suis adminsys), c'est la première fois que je poste une source PHP sur un réseau public et j'étais impatient d'être jugé sur mon code, afin d'une part de me situer et d'autre part de corriger des mauvaises habitudes que j'aurai pu prendre.
MangaII
Messages postés129Date d'inscriptiondimanche 9 décembre 2001StatutMembreDernière intervention12 janvier 2009 17 août 2009 à 07:56
Ben si ... y'a des choses à dire !
Pas mal l'expression rationnelle ... mais était-ce vraiment nécessaire ?
Par contre, la clarté du code mérite des points à elle seule !
Je ne l'ai même pas testé, mais un code aussi joli ne peut que fonctionner.
Bravo !
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDernière intervention 2 mars 2013 14 août 2009 à 12:22
Aucun commentaire... je suis déçu ! Me serais attendu à au moins un mot sur mon expression rationnelle sur les dotted quad ou sur ma fonction getNetwork et l'astuce pour faire un & binaire sur un uint32... C'est qu'il n'y a rien à redire à ma source ? :D
7 oct. 2009 à 18:10
En gros, j'avais oublié que preg_match reproduisait la chaine en case 0, quand j'ai codé le constructeur... ce qui était sioux, c'est que je m'en suis rappelé dans le reste du code :/
Je pense toujours au /31 et /32... mais après le manque de temps, la bronchite... le destin s'acharne :)
7 oct. 2009 à 16:26
Je lui fourni une ip 10.10.10.10 avec un masque de 255.255.0.0 et j'ai un beau network à 10.10.10.0 (!)
<?php
require('IP4Calc.class.php');
$oIP = new IP4Calc("10.10.10.10", "255.255.0.0");
$network=$oIP->get(IP4Calc::NETWORK, IP4Calc::QUAD_DOTTED);
$broadcast=$oIP->get(IP4Calc::BROADCAST, IP4Calc::QUAD_DOTTED);
echo "Le net serait ".$network;
echo "\nLa diff. serait ".$broadcast;
?>
php test.php
Le net serait 10.10.10.0
La diff. serait 10.10.10.255
La bonne réponse est : 10.10.0.0 et 10.10.255.255
code à revoir...
:)
13 sept. 2009 à 12:30
C'est donc une justification esthétique et pratique.
Et pardon, j'ai lu un peu trop rapidement le code, en effet les constantes servent d'index dans le tableau "général".
Merci pour ton explication
13 sept. 2009 à 11:34
Désolé, je suis encore sous l'eau en ce moment... mais promis, je pense à corriger le bug des /31 et /32. Je ne vois pas d'autre solution que de faire un hack bien moche "if /31 then" :o/ Cela dit, en lisant la RFC, elle est issue elle-même d'un vieux hack des spécifications des masques :)
Pour répondre à ta question MrJay42, et bien, heu... en fait faudrait déjà que je comprenne :P Je ne modifie pas mes constantes dans le constructeur.
En fait, à l'aide de mes constantes (vraies constantes, j'entends), j'initialise des tableaux. Pourquoi faire ? Pour "cacher" la réponse des calculs. Mettons que tu demandes plusieurs fois la même information, celle ci est cachée, et j'économise les qq microsecondes de calcul... Bon j'avoue, ca doit représenter que dalle, mais je préfère gaspiller un peu de mémoire, le temps que l'objet existe, plutôt que refaire des calculs déjà faits.
Ensuite, j'ai utilisé un tableau, plutôt que des variables sépérarées, pour compacter un peu le code, sans trop le complexifier. J'aurai pu faire un tableau par information (pour le cache), et faire un get par données avec le format en paramètre, il est vrai. C'est juste que c'était plus long à écrire, et assez répétitif, à base de nombreux copier/coller peu intéressants et donc source d'erreur.
Tant que ca reste comprehensible, moins il y a de lignes, moins il y a de bugs possibles :p
13 sept. 2009 à 10:32
Mais j'ai une question qui peut sembler "bête" :
Pourquoi ? :
Pourquoi tout mettre dans des constantes ? Qui sont modifiées dans le constructeur...
Pourquoi mettre toutes ces constantes dans un tableau ?
Pourquoi ne pas gérer la classe avec des attributs en private avec des get() et des set()...old school pour ainsi dire...
En tout cas merci pour cette classe qui peut être carrément utile :)
Ciao
3 sept. 2009 à 12:23
1 sept. 2009 à 10:55
Merci beaucoup pour tes remarques.
1 sept. 2009 à 08:57
Pour l'instant j'ai rajouter un controle pour utiliser le MAX_HOST a la place du MIN_HOST lorsque le masques est en /31
Pour info ipcalc le gère ;-)
1 sept. 2009 à 08:30
Je crois que le bug réside plutôt dans l'acceptation de masques supérieurs à 30, car un /31 ne contient pas d'hôtes du tout, juste un réseau et un broadcast et un /32 ne contient pas du tout de notion de réseau. Je devrais donc abaisser ma limite dans le constructeur à 30. Qu'en penses tu ?
31 août 2009 à 23:43
Cependant un petit bug du a la méthode utilisée: le calcul du MIN_HOST et MAX_HOST avec un subnet en /31 inverse les résultats.
27 août 2009 à 23:48
Il ne s'agit pas de fonctions inutiles mais de wrappers qui n'ont pas d'autres actions que d'uniformiser le nommage des fonctions (ce qui, pour troller un peu, est rare pour les fonctions internes de PHP =)). Une utilité notoire est ainsi de pouvoir retenir plus facilement les noms des fonctions et de pouvoir exécuter les fonctions en générant leurs noms dans une chaine de caractères via les constantes de type, comme je le fais dans la fonction get. Sans cela, j'aurai pu m'en sortir avec un switch, mais je trouvais cela moins élégant.
27 août 2009 à 22:28
Comme :
# static public function convertBinToInt32($sBin) {
# return bindec($sBin);
# }
19 août 2009 à 00:38
Ce message est destiné à mettre une note ><
18 août 2009 à 08:43
Je corrige ça dans l'après midi.
Merci beaucoup pour cette remarque.
18 août 2009 à 04:37
class IP4Calc {
const
IP = 'IP',
NETMASK = 'Netmask',
NETWORK = 'Network',
BROADCAST = 'Broadcast',
MIN_HOST = 'MinHost',
MAX_HOST = 'MaxHost',
PREVIOUS_HOST = 'PrevHost',
NEXT_HOST = 'NextHost',
PREVIOUS_NETWORK = 'PrevNetwork',
NEXT_NETWORK = 'NextNetwork',
INT32 = 'Int32',
BIN = 'Bin',
HEX = 'Hex',
QUAD_DOTTED = 'Quad',
DECIMAL = 'Dec';
....
Et en remplaçant tout les IP4CALC_ par self::
Sinon très bonne source, je la garde sous le coude ;)
17 août 2009 à 10:13
:)
17 août 2009 à 09:00
17 août 2009 à 07:56
Pas mal l'expression rationnelle ... mais était-ce vraiment nécessaire ?
Par contre, la clarté du code mérite des points à elle seule !
Je ne l'ai même pas testé, mais un code aussi joli ne peut que fonctionner.
Bravo !
14 août 2009 à 12:22