gpt4 book ai didi

java - java中获取正确的非虚拟MAC地址

转载 作者:行者123 更新时间:2023-11-30 04:58:56 29 4
gpt4 key购买 nike

我正在编程一个虚拟路由器。我的第一个任务是构建一个以太网框架。我目前正在尝试获取 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;
}

最佳答案

对隔离多个网络接口(interface)的支持是特定于操作系统的,因此 Java 中不提供内置支持。

查找“主”IP 地址的一个简单方法是连接到公共(public)服务器,并检查用于连接的“客户端地址”:

    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 的低级库来处理低级网络协议(protocol),甚至查找路由表。类似于 http://jnetpcap.com/您可能会感兴趣。

HTH

关于java - java中获取正确的非虚拟MAC地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7587612/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com