在Java中的datagramsocket中获取源的IP地址

Posted

技术标签:

【中文标题】在Java中的datagramsocket中获取源的IP地址【英文标题】:get IP Address of source in datagramsocket in Java 【发布时间】:2017-02-27 08:33:05 【问题描述】:

我有一个DatagramSocket,UDP 数据包通过它从客户端发送到服务器,反之亦然。我必须在回复数据包中包含 IP 源地址给客户端。有没有办法使用Java获取IP地址之类的?

我添加一些说明 我无法控制 UDP 客户端,这是第三方客户端。我只能控制 UDP 服务器。所以我不能在客户端源代码中使用 DatagramPacket.getAddress() ,而只能在服务器源代码中使用。 我知道没有必要在数据报包中包含 IP 地址源,因为源 IP 地址始终可供接收方使用(我认为来自 UDP 标头),但在我的情况下,我在客户端和服务器之间进行了某种握手,所以我必须在 UDP 有效负载数据中包含服务器地址。

CLIENT 192.168.x.x 发送 UDP 数据包到 SERVER 192.168.255.255:8010 作为对此服务器的回复,应该向客户端发送一个重播数据报包,我应该在其中添加服务器地址(es 192.168.y.y)

【问题讨论】:

【参考方案1】:

回答您更新后的问题: 获取您的服务器的 IP 地址"Getting the IP address of the current machine using Java" 并将其包含在您发送给客户端的负载中。

【讨论】:

DatagramPacket.getAddress() 返回 IP 客户端地址,在我的情况下,我希望有服务器 IP 地址。客户端向我的服务器发送一个 UDP 数据包(比如说 receivedPacket),我必须为客户端创建一个回复数据包,我将 serverIpAddress 放入其中 @pikimota 不,它没有。它返回 IP 地址。 好的,但我必须将此信息添加到 UPD 有效负载中,而不仅仅是 UDP 标头 @pikimota 不,你没有。接收方始终可以使用源 IP 地址。如果接收方是 Java,则正是通过这种方法。如果接收方正在调用 Berkeley Sockets API,则可以通过recvfrom() 和朋友的第四个参数获得。您不必将其添加到有效负载中。【参考方案2】:

我必须在给客户端的回复数据包中包含 IP 源地址

不,你没有。它已经在里面了。客户只需拨打DatagramPacket.getAddress()/getPort()/getSocketAddress()

如果这是为了发送回复,简单的方法是重用收到的DatagramPacket,只需更改数据,不理会地址信息。

【讨论】:

那么你的问题是什么?你知道你的源IP地址是什么,你有DatagramPacket,有什么问题??

以上是关于在Java中的datagramsocket中获取源的IP地址的主要内容,如果未能解决你的问题,请参考以下文章

Java中的DatagramPacket与DatagramSocket的初步

Java使用DatagramSocket

12.7-全栈Java笔记:Java网络编程

DatagramSocket - java.lang.NullPointerException [Android] [重复]

DatagramSocket客户端与服务端Java实例

在 Android 中同时使用 Datagramsocket 发送和接收 - 只是发送?