Net et Netmask
Le
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.
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."";
}
Code librement inspiré de http://www.perl.com/pub/2002/11/20/dns.html
Merci
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."";
}
Code librement inspiré de http://www.perl.com/pub/2002/11/20/dns.html
Merci
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
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
ebrnospam
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 - Perl en français -
En effet, après relecture de mon message et de votre message je me rend c ompte 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 ave c le résultat de la commande précédente.
Bien sûr il me serait possible d'utiliser le module Net::NetMask pour fai re 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 d essus.
Cordialement
Eric BERTHOMIER
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";
}
Ce qui présuppose que c'est un /24 ?
--
Nous vivons dans un monde étrange/
http://foo.bar.quux.over-blog.com/
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é