我正在给一个虚拟路由器编程。我的第一个任务是构建一个以太网帧。我当前正在尝试获取MAC源地址。我有代码来获取我的机器上正在使用的所有MAC地址,但是我有一个virtualbox主机网络,所以代码也获取了这个MAC地址。我在以编程方式确定应将哪个MAC地址用于以太网帧时遇到了问题。这是我当前的代码
private byte[] grabMACAddress(){
try{
InetAddress[] addresses = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
for(int i = 0; i < addresses.length; i++){
NetworkInterface ni = NetworkInterface.getByInetAddress(addresses[i]);
mac = ni.getHardwareAddress();
if (mac != null){
for(int j=0; j < mac.length; j++) {
String part = String.format("%02X%s", mac[j], (j < mac.length - (1)) ? "" : "");
s += part;
}
System.out.println();
}
else{
System.out.println("Address doesn't exist or is not accessible.");
}
}
}
catch(IOException e){
}
System.out.println(s);
return mac;
}发布于 2011-09-29 04:42:56
对隔离多个网络接口的支持是特定于操作系统的,因此Java中没有内置支持。
找到您的“主”IP地址的一个简单方法是连接到公共服务器,并检查用于连接的“客户端地址”:
Socket socket= new Socket();
SocketAddress endpoint= new InetSocketAddress("www.google.com", 80);
socket.connect(endpoint);
InetAddress localAddress = socket.getLocalAddress();
socket.close();
System.out.println(localAddress.getHostAddress());
NetworkInterface ni = NetworkInterface.getByInetAddress(localAddress);
byte[] mac = ni.getHardwareAddress();
StringBuilder s=new StringBuilder();
if (mac != null){
for(int j=0; j < mac.length; j++) {
String part = String.format("%02X%s", mac[j], (j < mac.length - (1)) ? "" : "");
s.append(part);
}
System.out.println("MAC:" + s.toString());
}
else{
System.out.println("Address doesn't exist or is not accessible.");
}除此之外,您可能希望研究基于JNI的低级库来处理低级网络协议,甚至查找路由表。像http://jnetpcap.com/这样的东西可能会让您感兴趣。
HTH
https://stackoverflow.com/questions/7587612
复制相似问题