功能点
  • 判断某个IP地址是否合法
  • 判断两个IP地址是否在同一个网段中
  • 判断两个IP地址的大小关系
知识准备
  • IP协议
  • 子网掩码
  • Java
  • 正则表达式

基本原理

IP地址范围
0.0.0.0~ 255.255.255.255,包括了mask地址。

IP地址划分
  • A类地址:1.0.0.1~126.255.255.254
  • B类地址:128.0.0.1~191.255.255.254
  • C类地址:192.168.0.0~192.168.255.255
  • D类地址:224.0.0.1239.255.255.254
  • E类地址:240.0.0.1255.255.255.254
判断两个IP地址是否是同一个网段中
要判断两个IP地址是不是在同一个网段,就将它们的IP地址分别与子网掩码做与运算,得到的结果一网络号,如果网络号相同,就在同一子网,否则,不在同一子网。
例:假定选择了子网掩码255.255.254.0,现在分别将上述两个IP地址分别与掩码做与运算,如下图所示:
211.95.165.24 11010011 01011111 10100101 00011000
255.255.254.0 11111111 11111111 111111110 00000000
与的结果是: 11010011 01011111 10100100 00000000

211.95.164.78 11010011 01011111 10100100 01001110
255.255.254.0 11111111 11111111 111111110 00000000
与的结果是: 11010011 01011111 10100100 00000000
可以看出,得到的结果(这个结果就是网络地址)都是一样的,因此可以判断这两个IP地址在同一个子网。

如果没有进行子网划分,A类网络的子网掩码为255.0.0.0,B类网络的子网掩码为255.255.0.0,C类网络的子网掩码为255.255.255.0,缺省情况子网掩码为255.255.255.0

实现
以Java语言实现,主要针对IPv4地址。
代码实现如下(包括注释):
[java] view plain copy
  1. packageorg.slive.net;
  2. importjava.net.UnkNownHostException;
  3. importjava.util.regex.Pattern;
  4. /**
  5. *<pre>
  6. *IP地址范围:
  7. *0.0.0.0~255.255.255.255,包括了mask地址。
  8. *
  9. *IP地址划分:
  10. *A类地址:1.0.0.1~126.255.255.254
  11. *B类地址:128.0.0.1~191.255.255.254
  12. *C类地址:192.168.0.0~192.168.255.255
  13. *D类地址:224.0.0.1~239.255.255.254
  14. *E类地址:240.0.0.1~255.255.255.254
  15. *
  16. *如何判断两个IP地址是否是同一个网段中:
  17. *要判断两个IP地址是不是在同一个网段,就将它们的IP地址分别与子网掩码做与运算,得到的结果一网络号,如果网络号相同,就在同一子网,否则,不在同一子网。
  18. *例:假定选择了子网掩码255.255.254.0,现在分别将上述两个IP地址分别与掩码做与运算,如下图所示:
  19. *211.95.165.2411010011010111111010010100011000
  20. *255.255.254.0111111111111111111111111000000000
  21. *与的结果是:11010011010111111010010000000000
  22. *211.95.164.7811010011010111111010010001001110
  23. *可以看出,得到的结果(这个结果就是网络地址)都是一样的,因此可以判断这两个IP地址在同一个子网。
  24. *如果没有进行子网划分,A类网络的子网掩码为255.0.0.0,B类网络的子网掩码为255.255.0.0,C类网络的子网掩码为255.255.255.0,缺省情况子网掩码为255.255.255.0
  25. *@authorSlive
  26. */
  27. publicclassIpV4Util
  28. {
  29. //IpV4的正则表达式,用于判断IpV4地址是否合法
  30. privatestaticfinalStringIPV4_REGEX="((\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})";
  31. //系统子网掩码,它与ip组成一个地址
  32. intmask;
  33. //1代表A类,2代表B类,3代表C类;4代表其它类型
  34. finalintIP_A_TYPE=1;
  35. intIP_B_TYPE=2;
  36. intIP_C_TYPE=3;
  37. intIP_OTHER_TYPE=4;
  38. //A类地址范围:1.0.0.1---126.255.255.254
  39. int[]IpATypeRange;
  40. //B类地址范围:128.0.0.1---191.255.255.254
  41. int[]IpBTypeRange;
  42. //C类地址范围:192.168.0.0~192.168.255.255
  43. int[]IpCTypeRange;
  44. //A,B,C类地址的默认mask
  45. intDefaultIpAMask;
  46. intDefaultIpBMask;
  47. intDefaultIpCMask;
  48. //初始化
  49. static
  50. {
  51. IpATypeRange=newint[2];
  52. IpATypeRange[0]=getIpV4Value("1.0.0.1");
  53. IpATypeRange[1]=getIpV4Value("126.255.255.254");
  54. IpBTypeRange= IpBTypeRange[0]=getIpV4Value("128.0.0.1");
  55. IpBTypeRange[1]=getIpV4Value("191.255.255.254");
  56. IpCTypeRange= IpCTypeRange[0]=getIpV4Value("192.168.0.0");
  57. IpCTypeRange[1]=getIpV4Value("192.168.255.255");
  58. DefaultIpAMask=getIpV4Value("255.0.0.0");
  59. DefaultIpBMask=getIpV4Value("255.255.0.0");
  60. DefaultIpCMask=getIpV4Value("255.255.255.0");
  61. }
  62. *默认255.255.255.0
  63. */
  64. publicIpV4Util()
  65. mask=getIpV4Value("255.255.255.0");
  66. *@parammask任意的如"255.255.254.0"等格式,如果格式不合法,抛出UnkNownError异常错误
  67. publicIpV4Util(Stringmasks)
  68. mask=getIpV4Value(masks);
  69. if(mask==0)
  70. thrownewUnkNownError();
  71. }
  72. intgetMask()
  73. returnmask;
  74. /**
  75. *比较两个ip地址是否在同一个网段中,如果两个都是合法地址,两个都是非法地址时,可以正常比较;
  76. *如果有其一不是合法地址则返回false;
  77. *注意此处的ip地址指的是如“192.168.1.1”地址,并不包括mask
  78. *@return
  79. booleancheckSameSegment(Stringip1,Stringip2)
  80. returncheckSameSegment(ip1,ip2,mask);
  81. *比较两个ip地址是否在同一个网段中,如果两个都是合法地址,两个都是非法地址时,可以正常比较;
  82. *如果有其一不是合法地址则返回false;
  83. *注意此处的ip地址指的是如“192.168.1.1”地址
  84. *@return
  85. intmask)
  86. //判断IPV4是否合法
  87. if(!ipV4Validate(ip1))
  88. returnfalse;
  89. if(!ipV4Validate(ip2))
  90. intipValue1=getIpV4Value(ip1);
  91. intipValue2=getIpV4Value(ip2);
  92. return(mask&ipValue1)==(mask&ipValue2);
  93. booleancheckSameSegmentByDefault(Stringip1,Stringip2)
  94. intmask=getDefaultMaskValue(ip1);//获取默认的Mask
  95. *获取ip值与mask值与的结果
  96. *@paramipV4
  97. *@return32bit值
  98. intgetSegmentValue(StringipV4)
  99. intipValue=getIpV4Value(ipV4);
  100. return(mask&ipValue);
  101. *获取ip值与mask值与的结果
  102. *@paramipV4
  103. *@return32bit值
  104. intgetSegmentValue(Stringip,153); background-color:inherit; font-weight:bold">intipValue=getIpV4Value(ip);
  105. return(mask&ipValue);
  106. *判断ipV4或者mask地址是否合法,通过正则表达式方式进行判断
  107. *@paramipv4
  108. booleanipV4Validate(Stringipv4)
  109. returnipv4Validate(ipv4,IPV4_REGEX);
  110. booleanipv4Validate(Stringaddr,Stringregex)
  111. if(addr==null)
  112. else
  113. returnPattern.matches(regex,addr.trim());
  114. *比较两个ip地址,如果两个都是合法地址,则1代表ip1大于ip2,-1代表ip1小于ip2,0代表相等;
  115. *如果有其一不是合法地址,如ip2不是合法地址,则ip1大于ip2,返回1,反之返回-1;两个都是非法地址时,则返回0;
  116. intcompareIpV4s(Stringip1,153); background-color:inherit; font-weight:bold">intresult=0;
  117. intipValue1=getIpV4Value(ip1);//获取ip1的32bit值
  118. intipValue2=getIpV4Value(ip2);//获取ip2的32bit值
  119. if(ipValue1>ipValue2)
  120. result=-1;
  121. elseif(ipValue1<=ipValue2)
  122. result=returnresult;
  123. *检测ipV4的类型,包括A类,B类,C类,其它(C,D和广播)类等
  124. *@return返回1代表A类,返回2代表B类,返回3代表C类;返回4代表D类
  125. intcheckIpV4Type(StringipV4)
  126. intinValue=getIpV4Value(ipV4);
  127. if(inValue>=IpCTypeRange[0]&&inValue<=IpCTypeRange[1])
  128. returnIP_C_TYPE;
  129. if(inValue>=IpBTypeRange[0]&&inValue<=IpBTypeRange[returnIP_B_TYPE;
  130. if(inValue>=IpATypeRange[0]&&inValue<=IpATypeRange[returnIP_A_TYPE;
  131. returnIP_OTHER_TYPE;
  132. *获取默认mask值,如果IpV4是A类地址,则返回{@linkplain#DefaultIpAMask},
  133. *如果IpV4是B类地址,则返回{@linkplain#DefaultIpBMask},以此类推
  134. *@paramanyIpV4任何合法的IpV4
  135. *@returnmask32bit值
  136. intgetDefaultMaskValue(StringanyIpV4)
  137. intcheckIpType=checkIpV4Type(anyIpV4);
  138. intmaskValue=switch(checkIpType)
  139. caseIP_C_TYPE:
  140. maskValue=DefaultIpCMask;
  141. break;
  142. caseIP_B_TYPE:
  143. maskValue=DefaultIpBMask;
  144. break;
  145. caseIP_A_TYPE:
  146. maskValue=DefaultIpAMask;
  147. default:
  148. maskValue=DefaultIpCMask;
  149. returnmaskValue;
  150. *获取默认mask地址,A类地址对应255.0.0.0,B类地址对应255.255.0.0,
  151. *C类及其它对应255.255.255.0
  152. *@paramanyIp
  153. *@returnmask字符串表示
  154. staticStringgetDefaultMaskStr(StringanyIp)
  155. returntrans2IpStr(getDefaultMaskValue(anyIp));
  156. *将ip32bit值转换为如“192.168.0.1”等格式的字符串
  157. *@paramipValue32bit值
  158. staticStringtrans2IpStr(intipValue)
  159. //保证每一位地址都是正整数
  160. return((ipValue>>24)&0xff)+"."+((ipValue>>16)&8)&0xff)+"."+(ipValue&0xff);
  161. *将ipbyte数组值转换为如“192.168.0.1”等格式的字符串
  162. *@paramipBytes32bit值
  163. staticStringtrans2IpV4Str(byte[]ipBytes)
  164. //保证每一位地址都是正整数
  165. return(ipBytes[0]&0xff)+"."+(ipBytes[1]&2]&3]&0xff);
  166. intgetIpV4Value(StringipOrMask)
  167. byte[]addr=getIpV4Bytes(ipOrMask);
  168. intaddress1=addr[0xFF;
  169. address1|=((addr[2]<<0xFF00);
  170. address1|=((addr[1]<<0xFF0000);
  171. 0]<<0xFF000000);
  172. returnaddress1;
  173. byte[]getIpV4Bytes(StringipOrMask)
  174. try
  175. String[]addrs=ipOrMask.split("\\.");
  176. intlength=addrs.length;
  177. byte[]addr=byte[length];
  178. for(intindex=0;index<length;index++)
  179. addr[index]=(byte)(Integer.parseInt(addrs[index])&returnaddr;
  180. catch(Exceptione)
  181. byte[4];
  182. }

应用
copy
    voidmain(String[]args)throwsUnkNownHostException
  1. //判断ip两个地址的大小关系
  2. Stringip1="10.8.9.116";
  3. Stringip2="10.8.9.10";
  4. System.out.println("ip1大于ip2?"+(compareIpV4s(ip1,ip2)>0));
  5. Stringip3="10.8.8.116";
  6. Stringip4="10.10.9.10";
  7. System.out.println("ip3大于ip4?"+(compareIpV4s(ip3,ip4)>0));
  8. //判断ip两个地址是否是同一个网段
  9. intmask1=getIpV4Value("255.255.255.0");
  10. intmask2=getIpV4Value("255.255.0.0");
  11. System.out.println("ip1和ip2在同一个网段中?"+(checkSameSegment(ip1,mask1)));
  12. System.out.println("ip3和ip4在同一个网段中?"+(checkSameSegment(ip3,ip4,mask2)));
  13. //判断ip5是否在ip1和ip2范围中
  14. Stringip5="10.8.8.8";
  15. //假设ip1和ip2在同一个网段中,并且ip1为起始地址,ip2为结束地址,ip1<=1
  16. //比较ip1与ip5是否在同一个网段中
  17. if(checkSameSegment(ip1,ip5,mask1))
  18. if(((compareIpV4s(ip5,ip1))>=0)&&(compareIpV4s(ip5,ip2)<=0))
  19. System.out.println("ip5在ip1-ip2范围内");
  20. if((compareIpV4s(ip5,ip1))< System.out.println("ip5不在ip1-ip2范围内,因为ip5小于ip1");
  21. else
  22. System.out.println("ip5不在ip1-ip2范围内,因为ip5大于ip2");
  23. System.out.println("ip5不在ip1-ip2范围内,因为ip5不在ip1的网段中");
  24. }

判断两个IP地址是否在同一个网段中的更多相关文章

  1. iOS:UDID已弃用… MAC地址?

    我们知道苹果公司不赞成开发者访问UDID.但据我所知,可以获得iDevice的MAC地址.那么有什么区别呢?

  2. swift 开发库

    1、CryptoSwiftswift加密库,支持md5,sha1,sha224,sha256...github地址:https://github.com/krzyzanowskim/CryptoSwift2、KingfisherKingfisher是一个异步下载和缓存图片的库类似于SDWebImage只不过它是纯Swift的实现github地址:https://github.com/onevcat

  3. Swift 实用的第三库

    http://www.swiftmi.com/topic/425.html给大家分享一些实用的第三方库,在这里就不介绍一下比如AlamofireSwiftyJSON等常用的了.重点介绍一些实用的.EZSwiftExtensionsSwift扩展集合包含很多常用的一些工具扩展.比如时间,系统版本等.详情查看README.md源码地址:GitHubFormatFormat数字、货币、地址及颜色进行格式

  4. Swift3.0 Swift2.3 获取IP地址 获取网关地址

    最近需要在Swift项目中获取路由器的网关地址,在网上找了半天的代码也没发现太多有价值的东西,而且大多都是OC代码,很少有Swift的相关代码,只找到了一个通过Swift代码获取设备IP的代码,最后实在没办法只能曲线救国了。下面上代码:思路就是把获取到的设备IP地址的最后一位手动修改为”1”,前面三位不需要修改,比如我的手机ip地址是192.168.31.212,所以网关地址就是192.168.31.1。最近苹果更新了Swift3.0,这里更新一下代码。

  5. android – 获取设备的MAC地址 – 当wifi关闭时

    我使用以下代码找到Android设备的MAC地址:但在这种情况下,当Wifi关闭时,我无法获得MAC地址.即使WIFI关闭,如何获取Android设备的MAC地址.谢谢解决方法为什么不立即启用Wifi,直到你获得MAC地址,然后在获得MAC地址后禁用它?

  6. android – Segmentation Fault中’code’的含义是什么?

    我在android中看到了这2个分段错误.一个说SEGV_MAPERR,另一个说SEGV_ACCERR.你能告诉我这两个有什么不同吗?

  7. android – 从“canonical_addresses”表中获取地址

    我正在开发一个Android应用程序.我从下面的uri中获取了recipient_id.现在我想使用收件人ID从canonical_addresses“表中获取地址.但我不知道查询canonical_addresses表”.我在网上搜索了很多.请帮我找个解决方案的朋友.解决方法Canonical表有两列,_id和地址.当您获得收件人ID时,您将在规范地址表中查找该ID.对于多个收件人,ID由空格分

  8. android – 我可以在我的应用中使用Google Places意图吗?

    我有一个应用程序,显示一个地图,其中包含用户附近地址的标记.我希望当用户点按标记时,可以在Google商家信息应用中打开地址标记.我不确定Places是否足够开放供其他人随意使用.目前我只是使用搜索API来获取地址的路线.不是最优雅的解决方案:(谢谢解决方法是的,可以使用意图打开Google商家信息活动.但我不知道如何将地址指定为数据参数.实际上,您可以通过意图在Android中打开任何应用程序.

  9. Android手机连接到3G时是否有MAC地址?

    我想知道Android手机在通过3G连接到互联网时是否有MAC地址?我假设他们这样做,所以我想我真正的问题是无论是否有访问它?

  10. vue如何自定义地址设置@

    这篇文章主要介绍了vue如何自定义地址设置@,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部