Java,DatagramPacket接收,如何判断本地ip接口

Posted

技术标签:

【中文标题】Java,DatagramPacket接收,如何判断本地ip接口【英文标题】:Java, DatagramPacket receive, how to determine local ip interface 【发布时间】:2014-02-26 14:59:33 【问题描述】:

以下是绑定到所有 ip 接口和特定 udp 端口​​的简单案例:

int bindPort = 5555;  // example, udp port number
DatagramSocket socket = new DatagramSocket(bindPort);

byte[] receiveData = new byte[1500];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

...

socket.receive(receivePacket);

我如何知道我在哪个 ip 接口上收到了数据包?

我可以看到有getSocketAddress()

获取SocketAddress(通常是IP地址+端口号) 此数据包正在发送到或来自的远程主机。

但返回远程 ip+port。我想知道本地ip(本例中本地端口为5555)。

std. 有可能吗? Java 库?

【问题讨论】:

我不明白,你已经知道了,因为你正在通过它。本地 IP 地址为 127.0.0.1。 本地IP地址不是总是127.0.0.1吗? 您对端口的看法是正确的,这很明显。但是本地地址可以是任何地址,因为我绑定到 0.0.0.0。明白了吗? InetAddress IP=InetAddress.getLocalHost(); System.out.println("IP of my system is := "+IP.getHostAddress()); 盗自***.com/a/9481944/3224483 【参考方案1】:

我知道这个问题。为了澄清这个目的:您通过 UDP 收到一个数据包(通常是某种发现实现)并希望返回一个类似的答案(“亲爱的客户,请从 http://<wtf-is-my-ip>:8080/thefile.txt 下载文件”)。我的机器有三个 IP:127.0.0.1、192.168.x.x 和 10.x.x.x,目标是找出远程客户端将 UDP 数据包发送到 192.168.x.x 并且这必须是也适用于另一个连接的 IP .

从weupnp project 我发现了以下代码,虽然不完美但对我有用:

    private InetAddress getOutboundAddress(SocketAddress remoteAddress) throws SocketException 
        DatagramSocket sock = new DatagramSocket();
        // connect is needed to bind the socket and retrieve the local address
        // later (it would return 0.0.0.0 otherwise)
        sock.connect(remoteAddress);

        final InetAddress localAddress = sock.getLocalAddress();

        sock.disconnect();
        sock.close();
        sock = null;

        return localAddress;
    

//DatagramPacket receivePacket;
socket.receive(receivePacket);
System.out.print("Local IP of this packet was: " + getOutboundAddress(receivePacket.getSocketAddress()).getHostAddress);

如果您在同一网络中有多个 IP,或者由于某些高级路由配置,代码可能会返回错误的 IP。但到目前为止,这是我能找到的最好的,并且对于大多数情况来说已经足够了。

【讨论】:

【参考方案2】:

您可以结合使用NetworkInterfaceInetAddress 类来获取网络的详细信息。

NetworkInterface

InetAddress

【讨论】:

如果我使用 tcp 和 ServerSocket 类,则有 getLocalSocketAddress() 会返回我需要的内容。但是使用 udp,我找不到类似的东西。

以上是关于Java,DatagramPacket接收,如何判断本地ip接口的主要内容,如果未能解决你的问题,请参考以下文章

java实现UDP通信

Java网络编程之UDP网络编程

00106_UDP通信

UDP传输

UDP 发送与接收数据

UDP通信网络编程