|
[Original]
[Print]
[Top]
|
哪位GG帮我完成一段比较ip地址范围的代码吗?小弟不会写perl程序,请达人指点。
要求是这样的:(不知道下面的per语法对不对,我只是描述一下是怎么回事)
my $begin = "192.168.1.1";
my $end = "192.168.2.255";
my $ip = "192.168.1.11";
要写一个函数比较$ip是否属于"从192.168.1.11到192.168.2.255"这个地址范围。
函数可以这样写:先把ip地址转换为32位的整数,也就是192.168.1.1变成16进制的
C0.A8.01.01也就是0xc0a80101,把192.168.2.255变成 0xc0a802ff,接着比较 $ip跟这两个16进制数的大小就行了,很简单的一个perl程序,请哪位帮我写一下,本人不懂perl的语法。
|
|
|
----
我是超级MM,我爱张飞、关羽、鲁智深。。。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
@sec = split(/./, $ip);
if ($sec[0] ne "192" || $sec[1] ne "168") {
print "bad ip
";
} elsif($sec[2] eq "1" || $sec[2] eq "2") {
print "ip OK
";
} else {
print "bad ip
";
}
|
|
|
----
Where is the RED pill? I want OUT!
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
是比较范围,不是比较相不相等,楼上贴的代码不符合要求吧.
只能先转化为32位整数再来比较,如果把ip地址split成四个整数比较的话很麻烦会出问题的,因为我们在C程序中比较时都是先转化成32位整数再比较的,哪位能帮忙用perl写一下吗,谢谢先~~
|
|
----
我是超级MM,我爱张飞、关羽、鲁智深。。。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
是这样的:
假如要比较192.168.1.250是不是属于192.168.1.1到192.168.2.1的范围,
如果你要split成四个整数比较,那么250这个数是大于192.168.2.1中的1,这样就比较失败啦!不知我说明白没有
|
|
----
我是超级MM,我爱张飞、关羽、鲁智深。。。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
楼上的在吗?
就用我说的方法帮忙写一下呀,实话告诉你,ip地址只能这样比较,你如果有别的方法我们来讨论一下
|
|
----
我是超级MM,我爱张飞、关羽、鲁智深。。。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
我写的只检查了C类,和250有什么关系?如果你先要检查ip有效性,网上搜一下多的是.
|
|
----
Where is the RED pill? I want OUT!
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
my $ip="192.168.2.233";
$ip=~m" d+ . d+ . (d+) . (d+)"x;
if ( ( $1==1 and $2>=11 ) or ($1==2 and $2<=255) ) {
print "good ip";
}
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
#!/usr/bin/perl -w
use strict;
use Socket;
my $min = unpack("N", inet_aton("192.168.1.1"));
my $max = unpack("N", inet_aton("192.168.2.255"));
my $ip = unpack("N", inet_aton("192.168.2.34"));
if ($ip >= $min && $ip <= $max) {
print "Valid
";
} else {
print "Invalid
";
}
|
|
|
----
UN*X is user^H^H^H^Hfriend-friendly.
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
自己研究了一下,这个样子就行了:
#!/usr/bin/perl
my $begin = "192.168.3.25";
my $end = "192.168.2.1";
my $ip = "192.168.1.250";
my $b, $e, $i;
@sec = split(/./, $begin);
$b = sprintf("0x%02x%02x%02x%02x", $sec[0], $sec[1],$sec[2],$sec[3]);
@sec = split(/./, $end);
$e = sprintf("0x%02x%02x%02x%02x", $sec[0], $sec[1],$sec[2],$sec[3]);
@sec = split(/./, $ip);
$i = sprintf("0x%02x%02x%02x%02x", $sec[0], $sec[1],$sec[2],$sec[3]);
print "$i $b $e
";
if ($i ge $b && $e ge $i) {
print "Valid
";
} else {
print "Invalid
";
}
|
|
|
----
我是超级MM,我爱张飞、关羽、鲁智深。。。
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
In reply to:
可不可以不用inet_aton这些库函数啊,我机器上没这些库.
#!/usr/bin/perl -w
use strict;
sub address {
my ($a, $b, $c, $d) = split (/./, $_[0]);
return $a << 24 | $b << 16 | $c << 8 | $d;
}
my $min = address("192.168.1.1");
my $max = address("192.168.2.255");
my $ip = address("192.168.2.34");
if ($ip >= $min && $ip <= $max) {
print "Valid
";
} else {
print "Invalid
";
}
|
|
|
----
UN*X is user^H^H^H^Hfriend-friendly.
|
|
[Original]
[Print]
[Top]
|
|