IP地址检测工具

Posted yaya625202

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IP地址检测工具相关的知识,希望对你有一定的参考价值。

编辑本文章

IP地址检测工具

/*
       名字:input.js
       功能:input类型通用JS
       包括:



       --------------------------------------------------------------------------------------------
                    1--IP相关检测及转换函数
                    
                        1>-isIP                检测IP是否合法                        2>-isMask                    检测掩码是否合法                        
                        3>-IPatol            IP字符串转为long                    4>-isIPMaskMatch    IP与掩码是否匹配



                        5>-isNet            是否是子网地址                        6>-isNetMaskMatch 子网与掩码是否匹配



                        7>-isIPConflict检测两IP/掩码网段冲突        8>-isNetConflict     检测两子网网段是否冲突
                        8>-isIPRangeVal检测IP范围是有效                    10>isIPRangeConflict检测两IP范围是否互相包含
                        
                    2--端口相关检测及转换函数
                        1>-isPort                    检测端口是否合法            2>-isPortRangeConflict    检测两端口范围是否冲突
                        3>-isPortRangeVal    检测端口范围是否有效



                        
                    3--字符串相关



                        1>-strlen                 字符串长度(返回字符串所占字节数)
            ---------------------------------------------------------------------------------------------------
*/

/*******************************************************************
**IP相关
********************************************************************/
//将字符串形式的IP转换成long
function IPatol(strIP)
{
    var ip=0;
    var array=strIP.split(".");
    if(array.length == 4)
    {
        ip=parseInt(ip)+parseInt(array[0])*16777216;
        ip=parseInt(ip)+parseInt(array[1])*65536;
        ip=parseInt(ip)+parseInt(array[2])*256;
        ip=parseInt(ip)+parseInt(array[3]);
    }
    return parseInt(ip);    
}

//IP是否合法,无提示,0.0.0.0被认为是不合法IP,如果IP可为0.0.0.0需在外部另加判断



function IPntoa(dwIP)
{
    var part1 = (dwIP>>24) & 0x000000FF;
    var part2 = (dwIP>>16) & 0x000000FF;
    var part3 = (dwIP>>8) & 0x000000FF;
    var part4 = (dwIP & 0x000000FF);
    
    return (part1.toString() + "." + part2.toString() + "." + part3.toString() + "." + part4.toString());
}


function isIP(strIP)     
{
    var re=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/; //IP正则  
  if(re.test( strIP ))    
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);
    
      var array = strIP.split(".");
    if ((array[0].charAt(0) == ‘0‘ && n1 != 0)
        || (array[1].charAt(0) == ‘0‘ && n2 != 0)
          || (array[2].charAt(0) == ‘0‘ && n3 != 0)
        || (array[3].charAt(0) == ‘0‘ && n4 != 0))
        return false;

  
      //首位必需为1-223之间除127之外的任一数字,末位不能为0或255
      if((n1>0 && n1<224 && n1!=127) && (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && ( n4>0 && n4<255))
      {
          return true;    
      }
  }
  return false;     
} 

//IP是否合法,无提示,0.0.0.0被认为是不合法IP,如果IP可为0.0.0.0需在外部另加判断



function isIP2(strIP)     
{
    var re=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/; //IP正则    
  if(re.test( strIP ))    
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);
    
      var array = strIP.split(".");
    if ((array[0].charAt(0) == ‘0‘ && n1 != 0)
        || (array[1].charAt(0) == ‘0‘ && n2 != 0)
          || (array[2].charAt(0) == ‘0‘ && n3 != 0)
        || (array[3].charAt(0) == ‘0‘ && n4 != 0))
        return false;
  
      //首位必需为1-223之间除127之外的任一数字,末位不能为0或255
      if((n1>=0 && n1<=255) && (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255))
      {
          return true;    
      }
  }
  return false;     
} 

//IP验证,有提示 
function isIP_t(strIP)
{
    if(strIP == "")
    {
        alert("请输入IP!");
        this.focus();
        return false;    
    }
    if(!isIP(strIP))
    {
         alert("IP无效!

(只能包含0-255之间的整数,

且首位必须是1-223之间除127以外的数字,

末位不能为0或255)");
         this.focus();
         return false;
    }
    return true;    
}

//掩码是否合法,无提示



function isMask(strMask)
{
    //var reg=/^(d{1,2}|1dd|2[0-4]d|25[0-5])(.(d{1,2}|1dd|2[0-4]d|25[0-5])){3}$/; //IP正则 
    var reg=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/;//IP正则
    if(reg.test(strMask))   
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);
      if(isNaN(n1) || isNaN(n2) || isNaN(n3) || isNaN(n4))
      {
          return false;
      }
      if( (n1>255 || n1<0)|| (n2>255 || n2<0) || (n3>255 || n3<0) || (n4>255 || n4<0))
      {
          return false;    
      }

      var tmp = (n1*Math.pow(2,24))+(n2*Math.pow(2,16))+(n3*Math.pow(2,8))+n4;
        if(tmp < Math.pow(2,31))
        {
            return false;
        }
        else
        {
            tmp -=  Math.pow(2,31);
            //后续位必须为连续的1
            for (i = 30; i > 1; i --)
            {
                if (tmp == 0)
                {
                    break;
                }
                else if(tmp < Math.pow(2,i))
                {
                    return false;
                }
                else
                {
                    tmp -= Math.pow(2,i);
                }
            }
        }
  }
  else//!reg.match( strMask)
  {
      return false;    
  }
    return true;
}

//掩码是否合法,0.0.0.0是合法的
function isMask2(strMask)
{
    if(!isMask(strMask))
    {
        if(strMask == "0.0.0.0")
        {
            return true;
        }
        else
            return false;
    }
    else
        return true;
}

//子网掩码验证,有提示
function isMask_t(strMask)
{
    if(strMask == "")
    {
        alert("请输入掩码!");    
        return false;
    }
    if(!isMask(strMask))
    {
        alert("请输入有效的子网掩码!");
        return false;    
    }
    return true;
}

//IP与掩码匹配验证,在执行此函数前,需已对IP及掩码的有效性做过检验



function isIPMaskMatch(strIP, strMask)
{
    var nIP = IPatol(strIP);
    var nMask = IPatol(strMask);
    if (((nIP|nMask)== -1) || (((nIP|nMask)+Math.pow(2,32)) == nMask))
    {
        return false;
    }
    
    return true;
}

//验证是否是合法的子网地址,0.0.0.0认为是不合法
function isNet(strNet)
{
    var re=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/; //IP正则    
  if(re.test( strNet ))    
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);    
      //首位为1-223之间除127以外的数字



      if( (n1>0 && n1<224 && n1!=127)&& (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255))
      {
          return true;    
      }
  }
  
    return false;
}

//验证是否是合法的子网地址,0.0.0.0认为是合法



function isNet2(strNet)
{
    var re=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/; //IP正则    
  if(re.test( strNet ))    
  { 
      var n1 = parseInt(RegExp.$1);
      var n2 = parseInt(RegExp.$2);
      var n3 = parseInt(RegExp.$3);
      var n4 = parseInt(RegExp.$4);    
      //首位为1-223之间除127以外的数字



      if( (n1>=0 && n1<224 && n1!=127)&& (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255))
      {
          return true;    
      }
  }
  
    return false;
}

//验证子网与掩码的匹配,在执行此函数之前,需对子网及掩码的有效性做验证
function isNetMaskMatch(strNet,strMask)
{
    var tmpArray=strNet.split(".");
    var tmpArray2 = strMask.split(".");    
    if(tmpArray.length != 4 || tmpArray2.length != 4)
    {
        return false;    
    }    
    for (i = 0; i < 4; i++)
    {
        tmpArray[i] = parseInt(tmpArray[i]);
        tmpArray2[i] = parseInt(tmpArray2[i]);        
        if ((tmpArray[i]|tmpArray2[i])!=tmpArray2[i])
        {
            return false;
        }
    }
    
    return true;    
}

//验证两IP/掩码 网段是否冲突,在调用该函数前,需已检测传入参数的有效性



//true -- 冲突,false -- 未冲突



function isIPConflict( strIP1,strMask1, strIP2, strMask2)
{
    var ip1 = IPatol(strIP1);
    var mask1 = IPatol(strMask1);
    var ip2 = IPatol(strIP2);
    var mask2 = IPatol(strMask2);
    if(ip1 == 0 || mask1 == 0 || ip2 == 0 || mask2 == 0)
    {
        return false;    
    }
    
    if( (ip1&mask1&mask2) == (ip2&mask2&mask1))
    {
        return true;    //网段冲突
    }    
    return false;
}


//验证两子网网段是否冲突(具有包含关系),在调用该函数前,需已检测传入参数的有效性



//true -- 冲突,false -- 未冲突



function isNetConflict( strNet1,strMask1,strNet2,strMask2)
{
    var net1 = IPatol(strNet1);
    var mask1 = IPatol(strMask1);
    var net2 = IPatol(strNet2);
    var mask2 = IPatol(strMask2);
    if(net1 == 0 || mask1 == 0 || net2 == 0 || mask2 == 0)
    {
        return false;    
    }
    //冲突
    if( (net1&mask2) == (net2&mask1))
    {
        return true;    
    }
    
    return false;
}

//验证IP范围是否有效(起始IP不能大于结束IP)
function isIPRangeVal(strIPFrom,strIPTo)
{
    var ip1 = IPatol(strIPFrom);
    var ip2 = IPatol(strIPTo);
    
    if(ip1>ip2)
    {
        return false;    //起始IP大于结束IP
    }
    
    return true;    
}

//验证IP范围冲突(即是否具有包含关系),传入参数的有效性在调用该函数前已验证



function isIPRangeConflict(IPFrom1,IPTo1,IPFrom2,IPTo2)
{
    var ipf1 = IPatol(IPFrom1);
    var ipt1 = IPatol(IPTo1);
    var ipf2 = IPatol(IPFrom2);
    var ipt2 = IPatol(IPTo2);
    
    if(!((ipf1>ipt2) || (ipt1<ipf2)))
    {
        return true;    //IP范围具有包含关系
    }
    
    return false;
}

/********************************************************************
**端口相关
*********************************************************************/
//是否是有效的端口
function isPort(strPort)
{
    var nport = parseInt(strPort); 
    if(isNaN(nport)||nport<1 ||nport>65535)
    {
        return false; //不是1-65535之间的数
    } 

    return true;    
}

//是否是有效的端口范围
function isPortRangeVal(strPort1,strPort2)
{
    var nport1 = parseInt(strPort1);
    var nport2 = parseInt(strPort2);
    if(isNaN(nport1) || isNaN(nport2))
    {
        return false;    
    }    
    if(nport1>nport2)
    {
        return false;    //起始端口大于结束端口
    }
    return true;
}

//端口范围是否冲突
function isPortRangeConflict(PortF1,PortT1,PortF2,PortT2)
{
    var nf1 = parseInt(PortF1);
    var nt1 = parseInt(PortT1);
    var nf2 = parseInt(PortF2);
    var nt2 = parseInt(PortT2);
    if(isNaN(nf1) || isNaN(nt1) || isNaN(nf2) || isNaN(nt2))
    {
        return false;    
    }    
    if( !( (nf1>nt2) || (nT1<nf2) ))
    {
        return false;//端口范围冲突    
    }
    return true;
}


/********************************************************************
**字符串相关



*********************************************************************/

//取得字符串的字节数(一个汉字占三个字节)
function strlen(str)
{
    var cnt = 0;
    for( i=0; i<str.length; i++)
    {
        var value = str.charCodeAt(i);
        if( value < 0x080)
        {
            cnt += 1;
        }
        else if( value < 0x0800)
        {
            cnt += 2;
        }
        else 
        {
            cnt += 3;
        }
    }
    return cnt;
}

function isInputVilid(tmp)
{
//    var tmp = obj.value;
    if(tmp.indexOf(‘"‘)!=-1 || tmp.indexOf("<")!=-1 || tmp.indexOf(">")!=-1 
            || tmp.indexOf("‘")!=-1 || tmp.indexOf("&")!=-1 
            || tmp.indexOf("%")!=-1 || tmp.indexOf("#")!=-1 || tmp.indexOf("=")!=-1 
            || tmp.indexOf("\\")!=-1 || tmp.indexOf(":")!=-1 || tmp.indexOf(",")!=-1)
    {
        return false;
    }
    return true;
}

function encryptPasswd(str)
{
    //dlan4.6 只支持https登录, 不在需要控件加密
    //var pwdStr =  escape(str);
    //return active.EncryptUTF8(pwdStr);
    //return active.Encrypt(str);
    return str;
}

//验证IP范围是否有效(起始IP不能大于结束IP)
function isIPinRange(strIP, strIPFrom,strIPTo)
{
    var ip = IPatol(strIP);
    var ip1 = IPatol(strIPFrom);
    var ip2 = IPatol(strIPTo);
    
    if(ip1>ip2)
    {
        return false;    //起始IP大于结束IP
    }
    
    if (ip < ip1 || ip > ip2)
    {
        return false;
    }
    
    return true;    
}

/********************************************************************
**webagent相关
*********************************************************************/
//判断strIpPort是否是ip:port的形式。比如1.2.3.4#1.2.3.5:4009
function isIpPort(strIpPort)
{
    if (strIpPort == null || strIpPort.length == 0)
    {
        return false;
    }
    var rex = /^([0-9.]+#){0,3}[0-9.]+:d+$/;//判断是否是ip1#ip2#ip3:port
    if ( ! rex.test(strIpPort) )
    {
        return false;
    }
    var arr = strIpPort.split(/:|#/);
    if ( ! isPort(arr[arr.length-1]) )
    {
        return false;
    }
    for (i = 0 ;i < arr.length-1 ; i++)
    {
        if ( ! isIP(arr[i]) )
        {
            return false;
        }
    }
    return true;
}

//判断strDomainPort是否是 动态域名:端口 的形式
function isDomainPort(strDomainPort)
{
    if (strDomainPort == null || strDomainPort.length == 0)
    {
        return false;
    }
    rex=/^([w-]+.)+[a-zA-Z]+:(d){1,5}$/
    if ( ! rex.test(strDomainPort))
    {
        return false;
    }
    var arr = strDomainPort.split(":");
    if ( ! isPort(arr[1]) )
    {
        return false;
    }
    return true;
}

//判断strUrl是否是url形式
function isUrl(strUrl)
{
    if (strUrl == null || strUrl.length == 0)
    {
        return false;
    }
    rex=/^([w-]+.)+[w]+(:(d){1,5})?(/[w- .?%&=]*)+(/)?$/
    strUrl = encodeURI(strUrl); //以防路径名有中文
    if (rex.test(strUrl))
    {
        return true;
    }
    return false;
}

/*从strWebagt获取正确的webagent地址
 首先自动转换句号冒号到英文,
 然后判断webagent是否为下面的格式,
   1> 固定IP:端口(其中固定IP支持多IP,最多支持四个IP,各IP之间以#号分隔,如:202.96.137.75#60.28.239.21:4009); 
   2> 动态域名:端口(如:www.sangfor.com.cn:4009); 
   3> 动态网页(如:www.sangfor.com/NG4.0/test.php).
 如果不是返回null,如果是则返回转换得到的地址
*/
function getRightWebagent(strWebagt)
{
    if (strWebagt == null || strWebagt.length == 0)
    {
        return null;
    }
    
    strWebagt = strWebagt.replace(/^http(:|:)///,""); //如果http://头 则去掉
    
    // 将"/"以前的句号冒号全部替换成英文的
    var arr = strWebagt.split("/");
    arr[0] = arr[0].replace(/:/g,":");
    arr[0] = arr[0].replace(/。/g,".");
    strWebagt = arr.join("/");
    
    if ( isIpPort(strWebagt) )
    {
        return strWebagt;
    }
    
    if ( isDomainPort(strWebagt) )
    {
        return strWebagt;
    }
    
    if ( isUrl(strWebagt) )
    {
        return strWebagt;
    }
    return null;
}

 

以上是关于IP地址检测工具的主要内容,如果未能解决你的问题,请参考以下文章

一个基于C#编写的基础网络信息检测工具

从 Worklight Client 代码中检测 Worklight Server 主机名/IP 地址

局域网IP地址冲突怎么办?

ip有效性检测及代码优化

IP地址的位置检测技术

如何检测本地网络上其他设备的 IP 地址?