以下是绑定到所有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 )。
有可能是性病。Java库?
发布于 2015-08-12 13:07:05
我知道这个问题。为了澄清这个问题的目的:您在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项目中,我发现了以下代码,这并不完美,但却适用于我:
    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。但到目前为止,这是我所能找到的最好的,而且对于大多数情况都是足够的。
发布于 2014-02-26 15:10:34
您可以使用NetworkInterface和InetAddress类的组合来获取网络的详细信息。
NetworkInterface
InetAddress
https://stackoverflow.com/questions/22045165
复制相似问题