Discussion:
Net et Netmask
(trop ancien pour répondre)
ebrnospam
2012-10-09 18:45:06 UTC
Permalink
Bonsoir à tous,

un petit problème réseau ...

Je dispose de l'adresse IP d'un poste et de son masque de réseau.
J'aurai besoin de connaître l'ensemble des plages réseau qui compose le
réseau auquel appartient ce poste.

Je m'explique :
Poste : 192.168.1.128
Masque : 255.255.254.0

J'aimerai que mon programme me donne :
192.168.0
192.168.1

Pour se faire, j'ai utilisé use Net::Netmask; mais je pense qu'il doit y
avoir mieux ...

#!/usr/bin/perl -w

use strict;
use Net::Netmask;

my $block = new Net::Netmask ('192.168.1.128', '255.255.254.0');

my (@data)=$block->inaddr();

while ( my ($zone,$start,$end)=splice(@data,0,3) )
{
my (@rz)=split(/\./,$zone);
my (@ipc)=reverse(splice(@rz,0,3));
my $network=join(".",@ipc);
print $network."\n";
}

Code librement inspiré de http://www.perl.com/pub/2002/11/20/dns.html

Merci
Damien Wyart
2012-10-09 19:43:06 UTC
Permalink
Post by ebrnospam
Je dispose de l'adresse IP d'un poste et de son masque de réseau.
J'aurai besoin de connaître l'ensemble des plages réseau qui compose
le réseau auquel appartient ce poste.
Poste : 192.168.1.128
Masque : 255.255.254.0
192.168.0
192.168.1
Je pense que cette fonction doit répondre à la question :
http://search.cpan.org/~mrsam/Net-CIDR-0.16/CIDR.pm#@octet_list=Net::CIDR::cidr2octets(@cidr_list);

Sinon, avec le module Netmask, on peut sans doute utiliser enumerate
(qui retourne toutes les adresses, donc c'est potentiellement lourd), et
en fonction du masque, calculer manuellement les différents réseaux.
--
DW
Damien Wyart
2012-10-09 19:45:25 UTC
Permalink
Bien sûr, il faudra auparavant utiliser
http://search.cpan.org/~mrsam/Net-CIDR-0.16/CIDR.pm#$cidr=Net::CIDR::addrandmask2cidr($address,_$netmask);
--
DW
Eric BERTHOMIER
2012-10-10 07:36:00 UTC
Permalink
Post by Damien Wyart
Bien sûr, il faudra auparavant utiliser
http://search.cpan.org/~mrsam/Net-CIDR-0.16/CIDR.pm#$cidr=Net::CIDR::addrandmask2cidr($address,_$netmask);
--
DW
Merci bien, pour ceux que ça intéresse ...

#!/usr/bin/perl -w

use strict;
use Net::CIDR; # libnet-cidr-perl

my $address='192.168.1.192';
my $netmask='255.255.254.0';

my $cidr=Net::CIDR::addrandmask2cidr($address, $netmask);

my @octet_list=Net::CIDR::cidr2octets($cidr);
foreach my $reseau (@octet_list)
{
print $reseau."\n";
}
Paul Gaborit
2012-10-09 23:55:38 UTC
Permalink
À (at) Tue, 09 Oct 2012 20:45:06 +0200,
Post by ebrnospam
Bonsoir à tous,
un petit problème réseau ...
Je dispose de l'adresse IP d'un poste et de son masque de réseau.
J'aurai besoin de connaître l'ensemble des plages réseau qui compose le
réseau auquel appartient ce poste.
Poste : 192.168.1.128
Masque : 255.255.254.0
192.168.0
192.168.1
Cette demande n'a pas vraiment de sens. C'est le masque qui détermine le
réseau. Si ce masque contient 23 bits (comme dans votre exemple), votre
réseau à une adresse sur 23 bits et 9 bits variables... mais toujours
une seule plage !
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Eric BERTHOMIER
2012-10-10 06:22:00 UTC
Permalink
Post by Paul Gaborit
À (at) Tue, 09 Oct 2012 20:45:06 +0200,
Post by ebrnospam
Bonsoir à tous,
un petit problème réseau ...
Je dispose de l'adresse IP d'un poste et de son masque de réseau.
J'aurai besoin de connaître l'ensemble des plages réseau qui compose le
réseau auquel appartient ce poste.
Poste : 192.168.1.128
Masque : 255.255.254.0
192.168.0
192.168.1
Cette demande n'a pas vraiment de sens. C'est le masque qui détermine le
réseau. Si ce masque contient 23 bits (comme dans votre exemple), votre
réseau à une adresse sur 23 bits et 9 bits variables... mais toujours
une seule plage !
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
En effet, après relecture de mon message et de votre message je me rend compte que je n'ai pas le masque réseau de la machine mais seulement son @IP. J'isole donc les 3 premiers octets de l'adresse IP pour la comparer avec le résultat de la commande précédente.

Bien sûr il me serait possible d'utiliser le module Net::NetMask pour faire un simple

si @IP dans reseau alors

mais le nombre de réseaux et d'@IP me font pencher pour une solution de décomposition.

Après je ne suis pas à l'abri d'une erreur d'algorithmique ;-D l'avenir le dira et je serai peut être obligé de prendre la solution juste au dessus.

Cordialement

Eric BERTHOMIER
Tonton Th
2012-10-13 12:01:16 UTC
Permalink
Post by Eric BERTHOMIER
J'isole donc les 3 premiers octets de l'adresse IP
Ce qui présuppose que c'est un /24 ?
--
Nous vivons dans un monde étrange/
http://foo.bar.quux.over-blog.com/
e***@rail.eu.org
2012-10-13 16:11:08 UTC
Permalink
Post by Tonton Th
Post by Eric BERTHOMIER
J'isole donc les 3 premiers octets de l'adresse IP
Ce qui présuppose que c'est un /24 ?
Ce qui nous ramène à la situation d'avant 1981 où il n'y avait que des
/8...
--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Loading...