A coisa útil para lembrar com endereços IP é que eles são na verdade apenas representações de um número de 32 bits.
Então você pode convertê-los em um decimal multiplicando os octetos como base 256.
Por exemplo:
217.29.0.0 == 216 * 256 ^ 3 + 29 * 256 ^2 + 0 * 256 ^1 + 0 * 256 ^ 0
== 3640655872
Então, dado um intervalo como o acima - primeiro converta os dois, de modo que você tenha um começo e um fim. Em seguida, compare os IPs recebidos para ver se eles se encaixam.
Então, algo assim (ilustrando o algoritmo):
#!/usr/bin/env perl
use strict;
use warnings;
my $ip_to_check = "204.12.5.10";
my $dword = 0;
for ( split( '\.', $ip_to_check ) ) { $dword *= 256; $dword += $_ }
print "Checking $dword\n";
while (<DATA>) {
my ( $start, $finish ) = m/([\d\.]+)/g;
my $start_dword = 0;
for ( split '\.', $start ) { $start_dword *= 256; $start_dword += $_ }
my $end_dword = 0;
for ( split '\.', $finish ) { $end_dword *= 256; $end_dword += $_ }
print "Range:\n";
print "\t$start \t=> $start_dword\n";
print "\t$finish \t=> $end_dword\n";
print "$ip_to_check is in $_\n" if $dword >= $start_dword and $dword <= $end_dword;
}
__DATA__
"217.29.0.0-217.29.255.255",
"204.12.0.0-204.12.255.255",
"198.54.223.0-198.54.223.255",
Poderia facilmente fazer isso como um 'script de verificação' - lendo um arquivo (em vez de DATA
) e obtendo $ip_to_check
de STDIN
).
(note - como perl
puro poderia ser transformado em um forro com facilidade, ou um script para chamar. Ou reescrito - eu diria que você poderia fazer isso com expr
facilmente).