gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:55:49 25 4
gpt4 key购买 nike

这是绑定(bind)到所有 ip 接口(interface)和特定 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 接口(interface)上收到数据包?

我可以看到有 getSocketAddress():

Gets the SocketAddress (usually IP address + port number) of the remote host that this packet is being sent to or is coming from.

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

是否有可能与标准。 Java 库?

最佳答案

我知道这个问题。为了阐明这样做的目的:您通过 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。但到目前为止,这是我能找到的最好的,并且对于大多数情况来说已经足够了。

关于Java,DatagramPacket接收,如何判断本地ip接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22045165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com