sub _in_cidr_dns { my ($cidr,$addr) = @_; my ($start, $range) = split /\//, $cidr; require DNS; my $start_dec = DNS::aton($start); my $addr_dec = DNS::aton($addr); return $addr_dec >= $start_dec && $addr_dec < $start_dec + 2 ** (32 - $range); } sub _in_cidr_aton { my ($cidr,$addr) = @_; my ($start, $range) = split /\//, $cidr; my $start_dec = unpack("N", pack("C4", split m/\./x, $start)); my $addr_dec = unpack("N", pack("C4", split m/\./x, $addr)); return $addr_dec >= $start_dec && $addr_dec < $start_dec + 2 ** (32 - $range); } sub _in_cidr_socket { my ($cidr,$addr) = @_; my ($start, $range) = split /\//, $cidr; require Socket; my $start_dec = unpack("N*",Socket::inet_aton($start)); my $addr_dec = unpack("N*",Socket::inet_aton($addr)); return $addr_dec >= $start_dec && $addr_dec < $start_dec + 2 ** (32 - $range); } sub _in_cidr_bin { my ($cidr,$addr) = @_; my ($start, $range) = split /\//, $cidr; my $start_binary = _ipv4_to_32bitbinary($start); my $addr_binary = _ipv4_to_32bitbinary($addr); my $starts_with = substr($start_binary,0,$range); return $addr_binary =~ /^$starts_with/; } sub _ipv4_to_32bitbinary { join "", map {sprintf "%08b", $_} split /\./, shift; }