Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Net et Netmask

7 réponses
Avatar
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."\n";
}

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

Merci

7 réponses

Avatar
Damien Wyart
* ebrnospam in fr.comp.lang.perl:
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



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
Avatar
Damien Wyart
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);



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
Avatar
Paul Gaborit
À (at) Tue, 09 Oct 2012 20:45:06 +0200,
ebrnospam écrivait (wrote):

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



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/>
Avatar
Eric BERTHOMIER
Le mercredi 10 octobre 2012 01:55:38 UTC+2, Paul Gaborit a écrit :
À (at) Tue, 09 Oct 2012 20:45:06 +0200,

ebrnospam écrivait (wrote):



> 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 compos e 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



Cette demande n'a pas vraiment de sens. C'est le masque qui détermine l e

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 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
Avatar
Eric BERTHOMIER
Le mardi 9 octobre 2012 21:45:26 UTC+2, Damien Wyart a écrit :
> 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);



Bien sûr, il faudra auparavant utiliser

http://search.cpan.org/~mrsam/Net-CIDR-0.16/CIDR.pm#$cidr=Net::CIDR::ad drandmask2cidr($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";
}
Avatar
Tonton Th
On 10/10/2012 08:22 AM, Eric BERTHOMIER wrote:

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/
Avatar
erwan
Tonton Th écrivait :

On 10/10/2012 08:22 AM, Eric BERTHOMIER wrote:

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é