java广播地址_用Java获得广播地址

在TCP/IP中,Internet地址可以用来指定单个主机,也可以用来指定网络,协议规定:一个主机号的所有位都为0的地址是保留给该网络本身的.同时还规定,IP地址可以用来指定一个广播(Broadcast,这种地址影射到硬件广播):主机号所有位都为1的地址就是该网络的Broadcast Address.

在IP地址编址方法上存在定向广播地址(Directed BA)和有限广播地址(Limited BA)的划分, 所谓定向是指广播地址中包含有效的网络ID和广播主机号,有限则是指不依赖于网络所分配的IP地址的广播地址,它也称为本地广播地址或全1广播地址,地址形式为:255.255.255.255.

在有些网上文章中,很多都没有明确指出广播和组播的区别,现在从IP编址方法的角度说明一下它们的不同:

组播地址是编址方案的一部分,属于D类IP地址,如下图:

ff403f7d8a958e9c3ce546a6d79f48f8.gif

软件中数据报头目标地址为D类的,均可看成是采用组播方式发送数据,这个过程也被称为组播.

当信息头中目的地址域的内容为广播地址时, 该帧被局域网上所有计算机接收. 这个过程称为广播.

在发送信息前, 如果不知道目的地址, 可以通过广播的方式寻址. 因特网上的地址解析协议(ARP)就采用广播的方法.

如何计算网络的广播地址呢,一般把网络地址的主机位全部置1就是广播地址了,但有时侯不是很直观,那么可以采用IP地址的有关算法进行计算得到,下面是计算广播地址的算法:

假如计算机的IP位址是192.15.156.205,子网掩码是255.255.255.224,

先把子网掩码255.255.255.224做 NOT 运算﹐可以得出﹕

00000000.00000000.00000000.00011111

然后再和IP做一次 OR 运算﹐就可以得到 Broadcast Address:

11000000.00001111.10011100.11001101 OR 00000000.00000000.00000000.00011111

(192.15.156.205 OR 255.255.255.224)

得出﹕ 11000000.00001111.10011100.11011111

(192.15.156.223)

192.15.156.223就是那个子网的广播地址了.

下面就是实现这个算法的java类清单.

public class BroadcastAddr {

private String netmask = "";

private String netaddr = "";

private String netbroadcastaddr = "";

/**

* @param args

*/

public static void main(String[] args) {

BroadcastAddr info = new BroadcastAddr();

try {

System.out.println(Inet4Address.getByName("ooad-navysea")

.toString());

System.out.println(Inet4Address.getAllByName("localhost").length);

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

info.setNetaddr("192.168.1.106");

info.setNetmask("255.255.255.0");

info.execCalc();

System.out.println(info.getNetbroadcastaddr());

}

public String getNetaddr() {

return netaddr;

}

public void setNetaddr(String netaddr) {

this.netaddr = netaddr;

}

public String getNetbroadcastaddr() {

return netbroadcastaddr;

}

public void setNetbroadcastaddr(String netbroadcastaddr) {

this.netbroadcastaddr = netbroadcastaddr;

}

public String getNetmask() {

return netmask;

}

public void setNetmask(String netmask) {

this.netmask = netmask;

}

public void execCalc() {

String[] tm = this.getNetmask().split("//.");

StringBuffer sb = new StringBuffer();

for (int i = 0; i < tm.length; i++) {

tm[i] = String.valueOf(~(Integer.parseInt(tm[i])));

}

String[] tm2 = this.getNetaddr().split("//.");

for (int i = 0; i < tm.length; i++) {

tm[i] = String.valueOf((Integer.parseInt(tm2[i]))

| (Integer.parseInt(tm[i])));

}

for (int i = 0; i < tm.length; i++) {

sb.append(intTOstr(tm[i]));

sb.append(".");

}

// sb.delete(sb.length()-1,sb.length());

sb.deleteCharAt(sb.length() - 1);

this.netbroadcastaddr = parseIp(sb.toString());

}

private String intTOstr(int num) {

String tm = "";

tm = Integer.toBinaryString(num);

int c = 8 - tm.length();

// 如果二进制数据少于8位,在前面补零.

for (int i = 0; i < c; i++) {

tm = "0" + tm;

}

// 1111 1111 1111 1111 1111 1111 1101 1110

// 如果小于零,则只取最后的8位.

if (c < 0)

tm = tm.substring(24, 32);

return tm;

}

private String intTOstr(String num) {

return intTOstr(Integer.parseInt(num));

}

private String parseIp(String fbg) {

String[] tm = fbg.split("//.");

StringBuffer sb = new StringBuffer();

for (int i = 0; i < tm.length; i++) {

sb.append(strToint(tm[i]));

sb.append(".");

}

// sb.delete(sb.length()-1,1);

sb.deleteCharAt(sb.length() - 1);

return sb.toString();

}

/**

* 把二进制数转换为十进制.

*

* @param str

* @return

*/

private int strToint(String str) {

int total = 0;

int top = str.length();

for (int i = 0; i < str.length(); i++) {

// System.out.println(str.charAt(i)+str.substring(i,i+1));

String h = String.valueOf(str.charAt(i));

// System.out.println(h+":"+top+":"+total);

top--;

total += ((int) Math.pow(2, top)) * (Integer.parseInt(h));

}

return total;

}

}

原文链接:

http://blog.csdn.net/keepeye/article/details/464406

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值