- 浏览: 880502 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (319)
- Thinking / 反思 (27)
- 我读的技术类图书 (3)
- 我读的非技术图书 (3)
- Java & Groovy (55)
- Ruby/Rails (9)
- Python (10)
- C/C++ (14)
- C# & .net (9)
- 互联网相关技术 (6)
- Database (6)
- Unix/Linux (6)
- WindowsDev (21)
- 工具使用 / Tips (62)
- 编程技术杂谈/咨讯 (6)
- 软工 / 敏捷 / 模式 (6)
- 易筋经 / 各种内功 (3)
- 充电 / 他学科知识 (6)
- 外语学习 (16)
- 我和宝宝的甜蜜生活 (24)
- 八卦 (3)
- 健康 (0)
- 无类别 (0)
- mTogether (4)
- 一页纸 (3)
- SAP (7)
- baby (2)
- abap (2)
- temp (1)
- network (1)
- 生活 (1)
最新评论
-
daliang1215:
收藏一下,好东西。 xp 的快捷键用的非常爽,到win7缺没有 ...
Windows7: 右键任务栏上的一个窗口, 用快捷键c关闭它 -
Alice南京:
感谢
Java GC 监视方法与工具 -
wjason:
今天在excel 2010上面写了一些代码,果然lookup有 ...
Excel 公式: 根据一个单元格的用户输入值, 自动设置另一个单元格的值 -
wjason:
因式分解:http://zh.wikipedia.org/wi ...
教孩子学编程: 数学题1 -
bbls:
不错 找了好久了
VS2010: 在Solution Explorer中,自动关联当前正在编辑的文件
这个讨论的起因是最近修改的一个bug,
我们的系统管理了一堆网络设备,为了方便用户,我们提供了一个视图叫做"Near me"。
在这个视图中会显示与本机在同一个网段内的所有网络设备。
以前这个功能不支持双网卡。而且子网掩码是写死的"255.255.255.0"
为此便进行了下面的调查。共有两种方法,后面会给出这两种方法的简单问题总结,以及对比。
取得子网掩码,方法一:JavaAPI
InterfaceAddress.getNetworkPrefixLength() , 这个方法会返回子网掩码前面的1的位数。
为了直观,下面的例子会将其转换为String并显示出来。
关于下面的例子,还有几点要说明:
1. 因为我们数据库中的ip地址存的全是字符串,所以例子中也已字符串的形式来操作。
对于很多方法,直接拿int来移位会更简单。
2. 为了让例子独立跑起来,没有将共同的部分抽取成更小函数,也没有使用apache.common这样的第三方包。
这就使得函数比较冗长。
不罗嗦了,代码大家将就着看,如下:
import java.net.InetAddress; import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; public class IPAddressTest { public static void main(String[] args) { printIpAddressAndSubnettest(); } public static void printIpAddressAndSubnettest() { try { Enumeration<NetworkInterface> eni = NetworkInterface .getNetworkInterfaces(); while (eni.hasMoreElements()) { NetworkInterface networkCard = eni.nextElement(); List<InterfaceAddress> ncAddrList = networkCard .getInterfaceAddresses(); Iterator<InterfaceAddress> ncAddrIterator = ncAddrList.iterator(); while (ncAddrIterator.hasNext()) { InterfaceAddress networkCardAddress = ncAddrIterator.next(); InetAddress address = networkCardAddress.getAddress(); if (!address.isLoopbackAddress()) { String hostAddress = address.getHostAddress(); System.out.println("address = " + hostAddress); if (hostAddress.indexOf(":") > 0) { // case : ipv6 continue; } else { // case : ipv4 String maskAddress = calcMaskByPrefixLength(networkCardAddress.getNetworkPrefixLength()); String subnetAddress = calcSubnetAddress(hostAddress, maskAddress); String broadcastAddress = networkCardAddress.getBroadcast().getHostAddress(); System.out.println("subnetmask = "+ maskAddress); System.out.println("subnet = "+ subnetAddress); System.out.println("broadcast = "+ broadcastAddress+"\n"); } } else { String loopback = networkCardAddress.getAddress().getHostAddress(); System.out.println("loopback addr = " + loopback +"\n"); } } System.out.println("----- NetworkInterface Separator ----\n\n"); } } catch (Exception e) { e.printStackTrace(); } } public static String calcMaskByPrefixLength(int length) { int mask = -1 << (32 - length); int partsNum = 4; int bitsOfPart = 8; int maskParts[] = new int[partsNum]; int selector = 0x000000ff; for (int i = 0; i < maskParts.length; i++) { int pos = maskParts.length - 1 - i; maskParts[pos] = (mask >> (i * bitsOfPart)) & selector; } String result = ""; result = result + maskParts[0]; for (int i = 1; i < maskParts.length; i++) { result = result + "." + maskParts[i]; } return result; } public static String calcSubnetAddress(String ip, String mask) { String result = ""; try { // calc sub-net IP InetAddress ipAddress = InetAddress.getByName(ip); InetAddress maskAddress = InetAddress.getByName(mask); byte[] ipRaw = ipAddress.getAddress(); byte[] maskRaw = maskAddress.getAddress(); int unsignedByteFilter = 0x000000ff; int[] resultRaw = new int[ipRaw.length]; for (int i = 0; i < resultRaw.length; i++) { resultRaw[i] = (ipRaw[i] & maskRaw[i] & unsignedByteFilter); } // make result string result = result + resultRaw[0]; for (int i = 1; i < resultRaw.length; i++) { result = result + "." + resultRaw[i]; } } catch (UnknownHostException e) { e.printStackTrace(); } return result; } }
取得子网掩码,方法二:解析系统命令
windows的命令ipconfig,linux的ifconfig,都会返回网络的配置信息。
我们可以利用System.exec(...)对其进行调用,并捕获其输出并进行分析,便可以得到ip地址与子网掩码的配对关系。
当然,如果能写个复杂一点的脚本,让他在java调用的时候,能够直接返回我们要的IP与子网掩码信息就更好了。
两种方法的总结与对比
1. 对比
上述两种方法对比起来,自然是API的方式更直接一些,平台也更通用一些。
2.问题点
但是这两种方法都存在着一个问题:
那就是,当双网卡中的某一块网卡的网线被拔掉的时候,便无法解析出该取得该网卡对应的IP以及子网掩码。
因为我们的系统的near me视图,管理的是数据库中的历史数据,而无需去网上进行即时搜索。
那么此时,上述的那个网线掉了的网卡,所对应的数据库中的历史数据,便无法在near me画面中显示出来。
3.总结
网卡这块是这样的(这是我以前不知道的一个认识):
一个OS可以有多块网卡,每块网卡可以有多个IP地址,每个IP地址可以有自己独有的一个子网掩码(彼此可以不同)
关于一个网卡上可以配多ip的方法,大家就各自放狗吧。
windows,linux上面都有"界面,命令,api方法"可以使用。
所以java api的方法也是:
先取得网卡的迭代器,然后再取得这个网卡对应的IP地址的迭代器,然后去的该地址对应的名字,掩码,广播地址等。
起初查找java api的时候,我是从InetAddress,Inet4Address,Inet6Address开始,
现在看来这些类是为了整个网络上的所有ip所设计的,
寻找本机ip的相关信息应该从NetworkInterface以及他对应的InterfaceAddress找起。
发表评论
-
使用Java调用Mantis提供的webservice, 获得Mantis数据
2012-06-07 14:58 3122写在前面 如果使用Mantis来管理bug, ... -
用netbeans做GUI:SocketException: Malformed reply from SOCKS server
2010-01-07 16:24 8664最近的项目是由一些不同的软件相互协作组成的(是的,就是说这个系 ... -
Java Class Loader
2009-12-28 19:57 1320Java中有三种ClassLoader 1. Boot ... -
文件监视: C# and Java
2009-06-15 14:34 2694最近我们组的Mr.S同学到别的项目组里面支援C#去了, 我也 ... -
Java线程: New他就Start他 (遇见JDK1.4.2_04以前的一个bug)
2009-04-28 09:13 1633我们的系统有OutOfMemory现象, Liu同学最近又发现 ... -
Java: 获得所有线程
2009-03-27 17:13 2078我想在一个时刻查看java中还存在的所有线程, 于是googl ... -
Java GC 监视方法与工具
2009-03-27 15:46 6821项目需要,将gc的监视方法,和gc log的分析工具整理一下, ... -
HttpComponents
2009-02-11 15:56 2716今天要做这样的一件事 ... -
Java documentation in Windows Help format
2009-01-10 17:16 1764.chm格式的java帮助文档查找起来很方便, 常用的库我自己 ... -
SWT Win32 Extension 介绍
2008-10-13 10:52 2670SWT Win32 Extension 这个项目 ... -
Java编码规范
2008-09-26 13:43 1759养成好的编码规范对项目组的好处不用多说~ 我最近在一个维护的项 ... -
Java CSV API
2008-09-24 10:04 7591项目中有一些功能是CSV相关的。新来的一个同事问是用什么写的。 ... -
JFugue - 给我的一个小小的惊喜
2008-09-20 18:32 1340今天看到了这篇博客: 让 Java 轻松乐动起来,使用 JFu ... -
Java "properties文件"编辑器 - eclipse插件
2008-09-16 12:07 2143HomePage: http://propedit.sourc ... -
使用java修改windows注册表
2008-08-06 15:04 4512项目中用到,整理如下: 方法1:利用java.util.p ... -
Eclipse插件开发中如何获得classpath下面的资源
2008-07-21 19:38 3059在我的脑海里面有好几个话题需要记录一下,而正因为好多,我现在已 ... -
cactus eclipse plugin is now unavailable!
2008-07-09 14:28 1381今天要下载个apache cactus的eclipse plu ... -
http://www.groovyland.net/pptshare/
2008-07-09 13:00 1295http://www.groovyland.net/pptsh ... -
Java开源报表制作
2008-07-04 17:16 3019http://www.open-open.com/19.htm ... -
将SunAS以Windows服务方式启动
2008-07-04 17:13 1524继续搞Windows service。这个主题竟然耗费了俺3篇 ...
相关推荐
1、 分别打开 A、B 两台主机 Windows 操作系统上的网络和共享中心,禁用实验中不使用的 2、 将 A 的子网掩码修改为 255.255.255.0,清
实现通过ip地址和子网掩码位数计算得出子网段的ip地址范围
目前为止最好用的: IPV6子网掩码计算器
实验二:理解子网掩码、网关和ARP协议的作用[归纳].pdf
子网掩码计算器下载/子网掩码计算器单机版--亲测好用 子网掩码计算器下载/子网掩码计算器单机版--亲测好用 子网掩码计算器下载/子网掩码计算器单机版--亲测好用 子网掩码计算器下载/子网掩码计算器单机版--亲测好用 ...
IpRangeUtil;java 校验Ip段(子网掩码); 支持 iptables.patterns=10.0.0.0/8,192.168.0.0/16,172.16.0.0/12,202.195.129.240/28,202.195.128.0/20
子网掩码及其应用子网掩码及其应用子网掩码及其应用子网掩码及其应用子网掩码及其应用
目前为止最好用的: IPV4子网掩码计算器, IPV4子网划分计算器
子网掩码计算器:子网掩码计算范围、十进制ip计算器、统配符掩码计算器
计算工具子网掩码计算工具子网掩码计算工具计算工具子网掩码计算工具子网掩码计算工具
用C语言实现的一个简单的子网掩码计算程序,先输入网段地址,再输入要分的子网数量,程序以点分二进制输出子网掩码。
子网掩码IP计算器子网掩码IP计算器子网掩码IP计算器子网掩码IP计算器子网掩码IP计算器子网掩码IP计算器子网掩码IP计算器子网掩码IP计算器子网掩码IP计算器子网掩码IP计算器
1、明确“子网”的函义 2、明确“掩码”的函义 3、牢记各类网络的默认掩码 4、关于正确有效的掩码 5、关于子网掩码的另类表示法 6、网络中有两个IP地址不可用 7、根据掩码来确定子网的数目 8、综合实例
子网掩码计算子网掩码计算子网掩码计算子网掩码计算子网掩码计算子网掩码计算
计算子网掩码的好工具计算子网掩码的好工具计算子网掩码的好工具计算子网掩码的好工具
在实验中,利用 ping 命令来检验主机间能否进行正常的双向通信。在"ping"的过程中, 源主机向目标主机发送 ICMP 的 Echo Request 报文(回送请求),目标主机收到后,向源主机发回 ICMP 的 Echo Reply 报文(回送...
java获取Centos7服务器网卡ip 子网掩码 默认网关 DNS 同时设置网卡 及 重启网卡参考
子网掩码计算器子网掩码计算器子网掩码计算器子网掩码计算器子网掩码计算器子网掩码计算器子网掩码计算器子网掩码计算器子网掩码计算器
子网掩码计算器 利用子网数来计算。 1.首先,将子网数目从十进制数转化为二进制数; 2.接着,统计得到的二进制数的位数,设为N; 3.最后,先求出此IP地址对应的地址类别的子网掩码。再将求出的子网掩码的主机地址部分...