返回列表 回复 发帖

[分享]如何编程判断一个IP地址是否属于某个网段?

有如下两个文本文件(IPlist.txt和IPsegment.txt),IPlist.txt包含有一些网站的IP地址,如何编程判断这些IP地址是否属于IPsegment.txt所列的网段中。
匹配的结果输出到文本文件matchinglist.txt中。
三个文件的格式如下:
IPlist.txt
www.yahoo.com,66.94.230.51
www.baidu.com,202.108.250.249
www.sina.com.cn,61.135.152.77
www.sohu.com,61.135.150.75
IPsegment.txt
219.111.192.0/18
68.132.0.0/17
61.135.0.0/16
192.162.0.0/16
152.172.0.0/16
34.132.0.0/14
97.208.0.0/13
matchinglist.txt
www.sina.com.cn,61.135.152.77
www.sohu.com,61.135.150.75
  1. #!/usr/bin/perl
  2. open(FF,"IPlist.txt");
  3. my %name;
  4. my %net;
  5. while(<FF>){
  6.   s/[\015\012]//;
  7.   my ($t1,$t2) = split(/,/);
  8.   $name{$t1} = $t2;
  9. }
  10. close(FF);
  11. open(FF,"IPsegment.txt");
  12. while(<FF>){
  13.   s/[\015\012]//;
  14.   my ($t1,$t2) = split(/\//);
  15.   $net{$t1} = $t2;
  16. }
  17. close(FF);
  18. for $net (keys %net){
  19.   my $netmask = $net{$net};
  20.   my $net_bits1 = &bitsIP($net,$netmask);
  21.   for $name (keys %name){
  22.      my $net_bits2 = &bitsIP($name{$name},$netmask);
  23.      if($net_bits2 eq $net_bits1){
  24.         print "$name,".$name{$name}."\n";
  25.         next;
  26.      }
  27.   }
  28. }
  29. &#35;--取得bits of net address
  30. sub bitsIP(){
  31.   my($ip,$netmask)= @_;
  32.   my @ip =split(/,/,$ip);
  33.   my $b = unpack("B32", pack("C4",$ip[0],$ip[1],$ip[2],$ip[3]));
  34.   my $substr= substr($b,0,$netmask);
  35.   return $substr;
  36. }
复制代码

                     我是一个呼吸着现在的空气而生活在过去的人
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
                                     我已习惯了孤独,爱上孤独
                                 他让我看清了自我,还原了自我
                             让我再静静的沉思中得到快乐和满足
                                   再孤独的世界里我一遍又一遍
                                   不厌其烦的改写着自己的过去
                                             延伸到现在与未来
                                       然而那只是泡沫般的美梦
                                 产生的时刻又伴随着破灭的到来
                         在灰飞烟灭的瞬间我看到的是过程的美丽
                                      而不是结果的悲哀。。。
返回列表