Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4174902
  • 博文数量: 291
  • 博客积分: 8003
  • 博客等级: 大校
  • 技术积分: 4275
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-30 18:28
文章分类

全部博文(291)

文章存档

2017年(1)

2013年(47)

2012年(115)

2011年(121)

2010年(7)

分类: Python/Ruby

2011-03-23 10:47:04

上个月新闻上说ipv4最后一个段也分配完了,使用ipv6很快是趋势,我们做网络程序,就得考虑ipv6了。
前些日子做网页时,用js写了个判断ipv6的函数,最近把它改为perl实现,大家可以随便使用
下面这个本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6:
程序代码如下:
  1. #本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6

  2. #  以下是用来将 IPv6 地址表示为文本字符串的三种常规形式:

  3. #冒号十六进制形式

  4. #  这是首选形式 n:n:n:n:n:n:n:n。每个 n 都表示八个 16 位地址元素之一的十六进制值。例如:

  5. #  3FFE:FFFF:7654:FEDA:1245:BA98:3210:4562.

  6. #压缩形式

  7. #  由于地址长度要求,地址包含由零组成的长字符串的情况十分常见。为了简化对这些地址的写入,

  8. # 可以使用压缩形式,在这一压缩形式中,多个 0 块的单个连续序列由双冒号符号 (::) 表示。此符号只能在地址中出现一

  9. #

  10. #次。例如,多路广播地址 FFED:0:0:0:0:BA98:3210:4562 的压缩形式为 FFED::BA98:3210:4562。

  11. #单播地址

  12. #3FFE:FFFF:0:0:8:800:20C4:0 的压缩形式为 3FFE:FFFF::8:800:20C4:0。

  13. #环回地址 0:0:0:0:0:0:0:1 的压缩形式为 ::1。

  14. #未指定的地址 0:0:0:0:0:0:0:0 的压缩形式为 ::。

  15. #混合形式

  16. #  此形式组合 IPv4 和 IPv6 地址。在此情况下,地址格式为 n:n:n:n:n:n:d.d.d.d,

  17. #其中每个 n 都表示六个 IPv6 高序位 16 位地址元素之一的十六进制值,每个 d 都表示 IPv4 地址的十进制值。

  18. #@author yifangyou

  19. #@version gslb 2011-03-23


  20. @testIP=("1.1.1.1","255.255.255.255","1.-2.3.4","a.b.c.d","CDCD:910A:2222:5498:8475:1111:3900:2020","::","::g","F:F:F::1:1","F:F:10F::","::F:F:10F","F:E:E:A:B:C:10.0.0.1","F:E:E:A:B:C:10.0.a.1","F::10.0.0.1","F:::10.0.0.1","::10.0.0.1");
  21. for my $ip (@testIP) {
  22.     my $result=isIP($ip);
  23.     if($result){
  24.         print "[$ip] is ipv$result\n";
  25.     }else{
  26.         print "[$ip] is not ip\n";
  27.     }
  28. }

  29. #计算CDCD:或者:2222的个数

  30. #@author yifangyou

  31. #@version gslb 2011-03-23

  32. #@return 0:表示没有找到,>0表示替换了多少个

  33. sub cLength{
  34.     my $s= shift;
  35.   return $s=~ s/([0-9a-f]{1,4}:)|(:[0-9a-f]{1,4})/ /gi;
  36. }

  37. #判断ipv4格式

  38. #@author yifangyou

  39. #@version gslb 2011-03-23

  40. #@return 0:表示不是ip,4:表示ipv4,6:表示ipv6

  41. sub isIP{
  42.     my $tmpstr=shift;
  43.     if(isIPv4($tmpstr)){
  44.         return 4;
  45.     }
  46.     if(isIPv6($tmpstr)){
  47.         return 6;    
  48.     }
  49.     return 0;
  50. }

  51. #判断ipv4格式

  52. #@author yifangyou

  53. #@version gslb 2011-03-23

  54. #@return 0:表示不是ipv4,1:表示ipv4

  55. sub isIPv4
  56. {
  57.     my $tmpstr=shift;
  58.     if(@matches=$tmpstr=~/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/i)
  59.   {
  60.         if($matches[0]<=255 && $matches[1]<=255 &&$matches[2]<=255 && $matches[3]<=255){
  61.                 return 1;
  62.             }
  63.   }
  64.   return 0;
  65. }

  66. #判断ipv6格式

  67. #@author yifangyou

  68. #@version gslb 2011-03-23     

  69. #@return 0:表示不是ipv6,1:表示ipv6

  70. sub isIPv6
  71. {
  72.      my $tmpstr=shift;
  73.     
  74. #        判断CDCD:910A:2222:5498:8475:1111:3900:2020

  75.     if($tmpstr=~/^([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$/i){
  76.         return 1;
  77.     }
  78. #        判断::

  79.     if($tmpstr=~/^::$/i){
  80.             return 1;
  81.     }
  82. #        F:F:F::1:1 F:F:F:F:F::1 F::F:F:F:F:1格式

  83.     if($tmpstr=~/^(([0-9a-f]{1,4}:){1,6})((:[0-9a-f]{1,4}){1,6})$/i){
  84.         my $c=cLength($tmpstr);
  85.         if($c>0 && $c<=7){
  86.             return 1;
  87.         }
  88.     }
  89.                         
  90. #        F:F:10F::

  91.     if($tmpstr=~/^([0-9a-f]{1,4}:){1,7}:$/i){
  92.         return 1;
  93.     }
  94.     
  95. #        ::F:F:10F

  96.     if($tmpstr=~/^:(:[0-9a-f]{1,4}){1,7}$/i){
  97.         return 1;
  98.     }
  99.         
  100. #        F:E:E:A:B:C:10.0.0.1格式

  101.         if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){6}(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
  102.         if(isIPv4($matches[1])){
  103.                 return 1;
  104.             }
  105.     }

  106. # F::10.0.0.1格式

  107.         if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){1,5}:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
  108.         if(isIPv4($matches[1])){
  109.                 return 1;
  110.             }
  111.     }        
  112. #        ::10.0.0.1格式

  113.         if(@matches=$tmpstr=~/^::(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
  114.         if(isIPv4($matches[0])){
  115.                 return 1;
  116.             }
  117.     }
  118.         return 0;
  119. }
 
阅读(4571) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

ssff0002011-03-25 12:47:46

刚入手的佳能7D是在【 http://safe.mn/2Gc8 】购买

质量可靠、价格实惠,支持支付宝交易、还有快递单号跟踪!

小雅贝贝2011-03-24 11:19:46

支持,文章不错哦~~谢谢参与活动~~

小雅贝贝2011-03-24 11:18:29

支持,文章不错哦~~谢谢参与活动~~

小雅贝贝2011-03-24 11:18:09

支持,文章不错哦~~谢谢参与活动~~