Java,DatagramPacket接收,如何确定本地ip接口

时间:2014-02-26 14:59:33

标签: java datagram

这是绑定到所有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 +端口。我想知道本地ip(在这个例子中本地端口是5555)。

是否可以使用std。 Java库?

2 个答案:

答案 0 :(得分:1)

我知道这个问题。为了澄清这个目的:你通过UDP接收一个数据包(通常是某种发现实现),并希望返回一个像(&#34;亲爱的客户端,请从http://<wtf-is-my-ip>:8080/thefile.txt&#34;)下载文件。我的机器有三个IP:127.0.0.1,192.168.xx和10.xxx,目的是找出远程客户端将UDP数据包发送到192.168.xx并且这必须是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。但到目前为止,它是我能找到的最好的,而且在大多数情况下都足够了。

答案 1 :(得分:0)

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

NetworkInterface

InetAddress