首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >尝试使用主机名获取网络设备的IP地址

尝试使用主机名获取网络设备的IP地址
EN

Stack Overflow用户
提问于 2019-01-28 05:07:35
回答 2查看 376关注 0票数 0

我正在尝试解析BeagleBone黑设备的IP地址,该设备位于运行我的应用程序的安卓设备的同一个网络上。我的设备的主机名是"tovremgw.local"。如果我尝试从windows pc命令行进行ping操作,它将成功地返回IPv6地址。

使用以下代码时:

代码语言:javascript
运行
AI代码解释
复制
new Thread(new Runnable(){
        public void run(){
            Inet6Address addr = null;
            try {
                addr = (Inet6Address) Inet6Address.getByName("tovremgw.local");
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
            System.out.println(addr);
        }
    }).start();

它将返回异常:

"java.net.UnknownHostException:无法解析主机"tovremgw.local":没有与主机名关联的地址“

我在一个模拟器中运行这个应用程序,就在我使用BeagleBone的同一台pc上。

EN

回答 2

Stack Overflow用户

发布于 2019-01-31 03:24:42

我不知道这是否是最好的答案,但我没有设法让它使用其他方法。我不知道这是否对有同样问题的人有帮助,但我会发布我的代码来说明我是如何做到的。

代码语言:javascript
运行
AI代码解释
复制
public String initUdpClient() throws IOException, InterruptedException {
    String tovremgwip = "";
    DatagramSocket s = new DatagramSocket();
    byte[] buffer = new byte[2048];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    int server_port = 5353;
    InetAddress inetaddress = InetAddress.getByName("224.0.0.251");
    char[] bytearray = {
            0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x08, 0x74, 0x6f, 0x76,
            0x72, 0x65, 0x6d, 0x67, 0x77, 0x05, 0x6c, 0x6f,
            0x63, 0x61, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x01
    };
    String messageStr = new String(bytearray);
    int msg_length = messageStr.length();
    byte[] message = messageStr.getBytes();
    DatagramPacket p = new DatagramPacket(message, msg_length, inetaddress, server_port);
    for(int i = 0; i < 3; i++){
        s.send(p);
        s.receive(packet);
        int length = packet.getLength();
        if(length > 0){
            int[] temparr = new int[length];
            for(int y = length - 4; y < length; y++){
                tovremgwip = tovremgwip + Integer.toString(packet.getData()[y] & 0xFF);
                if(y != length - 1) tovremgwip = tovremgwip + ".";
            }
            return tovremgwip;
        }
        packet.setLength(buffer.length);
        TimeUnit.SECONDS.sleep(1);
    }
    return "";
}

当我用wireshark敲击Beaglebone时,我成功地复制了我的PC发送的数据包。然后获取接收到的消息的最后四个字节。

票数 1
EN

Stack Overflow用户

发布于 2019-01-28 05:38:49

根据BeagleBoard 文档

如果您的Beagle通过以太网或WiFi连接到您的局域网(LAN),它将利用mDNS向您的计算机广播自己。如果您的计算机支持mDNS,则应将您的Beagle视为beaglebone.local。非BeagleBone板将使用替代名称。同一网络上的多个BeagleBone板将添加一个后缀,如Beaglebon-2.local。

这里使用的命名服务协议是多播DNS,它不同于标准的DNS协议(Unicast)。由于Inet6Address只支持标准的DNS和类型'A‘或'AAAA’的太记录,它将不会为您的目的服务。

我建议查看支持mDNS服务发现的库,如mndsjava

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54402715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档