【问题标题】:Additional bytes received by a DatagramPacketDatagramPacket 接收的附加字节
【发布时间】:2025-12-31 03:10:12
【问题描述】:

我第一次遇到一个问题,我正在使用 java DatagramSocket (s) 在我的应用程序中发送和接收数据。

这就是我发送数据的方式:

byte[] buffer = "my data".getBytes();
senderPacket = new DatagramPacket(buffer, 0, buffer.length, remoteAddress, remotePort);
socket.send(senderPacket);

现在当我发送 byte[] 缓冲区时,它的大小是 275。 但是当我在接收应用程序上收到数据包并从receiverPacket获取字节[]时,如下所示:

buffer = new byte[2048];
receiverPacket = new DatagramPacket(buffer, buffer.length);
socket.receive(receiverPacket);

我发现接收到的字节数是 278 个字节,即额外的 3 个字节。

这似乎不是一个大问题,但实际上是对我来说,请知道为什么会发生这种情况,以及如何解决它,任何合乎逻辑的解释都会有所帮助。

谢谢

【问题讨论】:

  • 你能运行一个像 tcpdump 这样的工具来看看到底发生了什么吗?了解这些额外字节是否出现在发送端或接收端会很有用。
  • 我在这里没有看到任何决定数据包长度的代码。

标签: java sockets udp datagram


【解决方案1】:

额外的 3 个字节可能是长度标记。我知道当我在 C/C++ 中使用套接字时,我通常将前 4 个字节用于发送消息的长度,然后我使用该数据来确定要读取多少字节才能读取整个消息。

【讨论】:

  • 不应该神奇地添加长度标记(或其他任何东西)。在任何情况下,3 个字节对于长度标记来说都是一个奇怪的大小,因为 UDP 数据包被限制为 65536 个字节,因此长度可以愉快地编码为 2 个字节。
最近更新 更多