gpt4 book ai didi

java - DatagramPacket 的 IP 字段何时从目的 IP 更改为源 IP?

转载 作者:行者123 更新时间:2023-12-02 09:52:42 30 4
gpt4 key购买 nike

我正在尝试熟悉一个项目中java中的数据报系统,目前,我们只使用UDP包。

为了发送消息,我们在 DatagramPacket 上设置目标 IP。

    /*
* The fields of this class are package-private since
* DatagramSocketImpl classes needs to access them.
*/
byte[] buf;
int offset;
int length;
int bufLength;
InetAddress address;
int port;

这样做时,“地址”字段将成为目标地址,但当我们收到包裹时,该字段对应于源地址。

我认为对象本身不是通过网络发送的,但它的信息是。

我简要检查了 DatagramPacket 和 DatagramSocket 的源代码,但似乎没有找到任何“地址”字段发生更改的实例。

我的猜测是,DatagramPacket 类只存储一个 IP,因为另一个是机器的,当消息通过网络发送时,UDP 包含这两个 IP,然后由 DatagramSocket.receive() 处理,将丢失的(源)地址放在数据报上。这是正确的吗?

最佳答案

I think that the object itself is not sent on over the network, but its information is.

显然!

Java 对象仅存在于正在运行的 Java 程序的上下文中。在 JVM 之外它根本不存在。

因此,即使在不同的 Java 应用程序之间发送序列化对象,您也没有真正发送该对象。 (您实际上正在发送对象状态的表示,可以将其反序列化以提供类似对象。)

<小时/>

回到你的问题。当您发送数据报包时,您并不是在发送 DatagramPacket 对象。 DatagramPacket 对象实际上是缓冲区,用于保存您正在发送的数据包或您刚刚收到的数据包。

就您的情况而言,您在具有(可能)不同 IP 地址的不同计算机上的不同 JVM 中拥有两个不同的 DatagramPacket 对象。实际发生的情况是:

  • DatagramSocket::receive在接收数据报时将DatagramPacket的远程地址设置为接收数据包的源IP;请参阅javadoc .
  • DatagramSocket::send 不会设置 DatagramPacket 的远程地址。相反,它使用它作为数据报的目的地;请参阅javadoc .

关于java - DatagramPacket 的 IP 字段何时从目的 IP 更改为源 IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56204694/

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