IP CALCULATOR

X_Cli Messages postés 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 2 mars 2013 - 14 août 2009 à 12:22
X_Cli Messages postés 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/50429-ip-calculator

X_Cli Messages postés 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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és 1 Date d'inscription lundi 31 août 2009 Statut Membre Derniè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és 5 Date d'inscription mardi 23 novembre 2004 Statut Membre Derniè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és 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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és 5 Date d'inscription mardi 23 novembre 2004 Statut Membre Derniè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és 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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és 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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és 2 Date d'inscription vendredi 17 février 2006 Statut Membre Derniè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és 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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és 2 Date d'inscription vendredi 17 février 2006 Statut Membre Derniè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és 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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és 67 Date d'inscription mercredi 2 juillet 2003 Statut Membre Derniè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és 2 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 19 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és 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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és 2 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 19 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 ?

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 ;)
simonviei Messages postés 17 Date d'inscription jeudi 13 avril 2006 Statut Membre Derniè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és 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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és 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 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és 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Derniè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
Rejoignez-nous