首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java,DatagramPacket接收,如何确定本地ip接口

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

Stack Overflow用户
提问于 2014-02-26 14:59:33
回答 2查看 4K关注 0票数 8

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

代码语言:javascript
运行
复制
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库?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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项目中,我发现了以下代码,这并不完美,但却适用于我:

代码语言:javascript
运行
复制
    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。但到目前为止,这是我所能找到的最好的,而且对于大多数情况都是足够的。

票数 5
EN

Stack Overflow用户

发布于 2014-02-26 15:10:34

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

NetworkInterface

InetAddress

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22045165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档