java - 如何从正在监听广播的多播套接字获取 IP 地址?

标签 java android sockets ip lan

我的服务器创建了一个多播套接字来监听 UDP 数据包。它正在接收发送到网络广播地址的数据包,但我无法获取发件人的 IP 地址:

multisocket.getInetAddress().getHostAddress();

返回

"::" 

(我猜是因为 null getInetAddress)。

如何获取发件人的IP地址?

提示:我猜这与未绑定(bind)套接字和基本上整个广播有关,因为这些数据包不是专门发送给我而是发送到整个网络,但它们不应该包含发件人的 IP 地址吗?请赐教。

代码如下:

public void run() {
    try {
        Thread.sleep(5000);
        Log.i("SERVERUDP", "Connecting...");
        MulticastSocket multisocket = new MulticastSocket(SERVERPORT);
        multisocket.setBroadcast(true);
        Log.i("SERVERUDP","Server's IP is: " + multisocket.getLocalAddress().getHostAddress());
        getLocalIpAddress();
        while(true){
            byte[] b = new byte[65535];
            ByteArrayInputStream b_in = new ByteArrayInputStream(b);
            DatagramPacket dgram = new DatagramPacket(b, b.length);
            multisocket.receive(dgram); // blocks
            ObjectInputStream o_in = new ObjectInputStream(b_in);
            Object o = o_in.readObject();
            dgram.setLength(b.length);
            b_in.reset();
            if(o.getClass().getSimpleName().equalsIgnoreCase("Request")){
                Request request = (Request)o;
                String inetaddress = multisocket.getInetAddress().getHostAddress();
                Log.i("SERVERUDP-if", "Sending request to IP: " + inetaddress);
                new Thread(new ClientTCP(inetaddress, createRequestFromBroadcast(request))).start();
            }else if(o.getClass().getSimpleName().equalsIgnoreCase("String")){
                Log.e("SERVERUDP-elseif-string", "WTF received a string: " + (String)o);
            }else{
                Log.e("SERVERUDP-else", "Unrecognized object of type: " + o.getClass().getSimpleName());
            }
            o_in.close();
            //iteration done only once for testing!
            break;
        }
        multisocket.close();
    } catch (Exception e) {
        Log.e("SERVERUDP", "Error", e);
    }
}

最佳答案

您收到的每个数据包可能有不同的源地址。所以我不确定您为什么要尝试查看 multisocket 来找出源地址。

我必须承认我还没有尝试过这个,但是 dgram.getSocketAddress ()multisocket.receive 调用返回后是否给你你想要的东西?

关于java - 如何从正在监听广播的多播套接字获取 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8365655/

相关文章:

java - 使用扫描仪读取文件时出现问题

java - RMI:rmi服务器是否同时只能与一个网络接口(interface)一起工作

java - 如何在启动器图标中添加类似像素的 Activity 快捷方式?

java - 通过随机访问通过网络流式传输文件 - java

java - 规范和政策之间的区别?

java - JAVA中如何避免到处检查线程中断

android - 如何在android上存储数据以便快速检索

android - 在 Flutter 中更改 AppBar 后退图标大小

具有 IPv6 地址的 Python TCP 套接字失败

互联网上的 Java UDP 客户端/服务器不起作用