📄 ipaddress.java
字号:
package jpcap;
import java.net.*;
import java.util.Hashtable;
/**
* IP傾僪儗僗傪昞尰偡傞偨傔偺僋儔僗偱偡丅<P>
* IPv4/v6偳偪傜偺傾僪儗僗傕昞尰偱偒傑偡丅傾僪儗僗偲僪儊僀儞柤偺曄姺側偳傕峴偄傑偡丅
**/
public class IPAddress
{
//be careful! network byte order!!
private byte[] addr;
private int ver;
private native String gethostnamenative(byte[] addr) throws UnknownHostException;
private native String gethostname6native(byte[] addr);
private native byte[] getaddr6native(String host)
throws UnknownHostException;
private static boolean isConvertAddress=false;
private static Hashtable domainNames=new Hashtable();
/**
* 僶乕僕儑儞偲傾僪儗僗傑偨偼僪儊僀儞柤傪巜掕偟偰傾僪儗僗傪嶌惉偟傑偡丅<P>
*
* @param version 偙偺傾僪儗僗偺IP僶乕僕儑儞
* @param address IP傾僪儗僗傑偨偼僪儊僀儞柤
* @exception java.net.UnknownHostException 傾僪儗僗偑晄摉側応崌
**/
public IPAddress(int version, String address) throws UnknownHostException{
this.ver=version;
if(ver==4){
this.addr=InetAddress.getByName(address).getAddress();
}else if(ver==6){
this.addr=getaddr6native(address);
}
}
/**
* 傾僪儗僗傑偨偼僪儊僀儞柤傪巜掕偟偰IPv4傾僪儗僗傪嶌惉偟傑偡丅
*
* @param address IP傾僪儗僗傑偨偼僪儊僀儞柤
* @exception java.net.UnknownHostException 傾僪儗僗偑晄摉側応崌
**/
public IPAddress(String address) throws UnknownHostException{
this(4,address);
}
/**
* 僶乕僕儑儞偲僶僀僩楍傪巜掕偟偰傾僪儗僗傪嶌惉偟傑偡丅<BR>
* 傾僪儗僗偺懨摉惈偼僠僃僢僋偟傑偣傫丅
*/
public IPAddress(int version,byte[] address){
this.addr=address;
this.ver=version;
}
/**
* 僶僀僩楍傪巜掕偟偰傾僪儗僗傪嶌惉偟傑偡丅<BR>
* 傾僪儗僗偺懨摉惈偼僠僃僢僋偟傑偣傫丅
*/
public IPAddress(byte[] address){
this.addr=address;
this.ver=4;
}
/**
* 偙偺IP傾僪儗僗傪僶僀僩楍偱曉偟傑偡丅
**/
public byte[] getAddress(){
return addr;
}
/**
* IP傾僪儗僗暥帤楍"%d.%d.%d.%d"傑偨偼"%x:%x::%x:%x"傪曉偟傑偡
**/
public String getHostAddress(){
if(ver==4)
return (int)(addr[0]&0x00ff)+"."+
(int)(addr[1]&0x00ff)+"."+
(int)(addr[2]&0x00ff)+"."+
(int)(addr[3]&0x00ff);
else
return toHex(addr[0])+
toHex(addr[1])+":"+
toHex(addr[2])+
toHex(addr[3])+":"+
toHex(addr[4])+
toHex(addr[5])+":"+
toHex(addr[6])+
toHex(addr[7])+":"+
toHex(addr[8])+
toHex(addr[9])+":"+
toHex(addr[10])+
toHex(addr[11])+":"+
toHex(addr[12])+
toHex(addr[13])+":"+
toHex(addr[14])+
toHex(addr[15]);
}
private String toHex(byte b){
String s=Integer.toHexString(b&0x00ff);
if(s.length()==1) return "0"+s;
else return s;
}
/**
* 僪儊僀儞柤傪曉偟傑偡丅
**/
public String getHostName() throws UnknownHostException{
if(domainNames.containsKey(this)){
Object name=domainNames.get(this);
if(name instanceof UnknownHostException)
throw (UnknownHostException)name;
else return (String)name;
}
String dname;
if(ver==4)
try{
dname=gethostnamenative(addr);
}catch(UnknownHostException e){
domainNames.put(this,e);
throw e;
}
else if(ver==6){
dname=gethostname6native(addr);
if(dname==null){
domainNames.put(this,new UnknownHostException(getHostAddress()));
throw new UnknownHostException(getHostAddress());
}
}else
return null;
domainNames.put(this,dname);
return dname;
}
/**
* java.net.InetAddress傪曉偟傑偡丅(僶乕僕儑儞偑4偺応崌偺傒)
* 僶乕僕儑儞偑6偺応崌偼null傪曉偟傑偡丅
**/
public InetAddress getInetAddress() throws UnknownHostException{
if(ver==4) return InetAddress.getByName(gethostnamenative(addr));
else return null;
}
/**
* 偙偺僆僽僕僃僋僩偲巜掕偝傟偨僆僽僕僃僋僩傪斾妑偟傑偡丅
**/
public boolean equals(Object p){
if(!(p instanceof IPAddress)) return false;
IPAddress ip=(IPAddress)p;
if(ver!=ip.ver || addr.length!=ip.addr.length) return false;
for(int i=0;i<addr.length;i++)
if(addr[i]!=ip.addr[i]) return false;
return true;
}
/**
* toString()儊僜僢僪偱傾僪儗僗偲僪儊僀儞柤偺偳偪傜傪曉偡偐
* 巜掕偟傑偡丅
* @param isDomainName True側傜偽僪儊僀儞柤傪,False側傜偽傾僪儗僗傪曉偟傑偡
**/
public static void setAddressConvert(boolean isDomainName){
isConvertAddress=isDomainName;
}
/**
* IP傾僪儗僗暥帤楍("%d.%d.%d.%d" 傑偨偼"%x:%x::%x:%x" )傑偨偼
* 僪儊僀儞柤傪曉偟傑偡
*/
public String toString(){
if(isConvertAddress){
try{
return getHostName();
}catch(UnknownHostException e){
return getHostAddress();
}
}else return getHostAddress();
}
public int hashCode(){
int code=ver;
for(int i=0;i<addr.length;i++){
code+=addr[i]<<(8*(i%4));
}
return code;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -