Indy IdUDPClient.sendbuffer - 接收缓冲区中的错误数据

Indy IdUDPClient.sendbuffer - False data in receive buffer

我正在使用 Indy 的 IdUDPClient 组件发送 UDP 数据包:

FIdUDPclient.sendbuffer( AIP, APort, FIdUDPBuffer );
Frecl := FIdUDPclient.receivebuffer( FIdRecBuff, FreceiveTimeout );

收到答复后。

调试代码时使用 wireshark 表明有时 receivebuffer FIdRecBuff 包含意外数据。

例如,使用 Wireshark 读取的接收字节数:
45 02 57 00
但是在调试 FIdRecBuff 时:
45 02 57 02

以上代码 运行 在一个工作线程中,具有一个专用的 IdUDPClient 实例。我只发送相同的 3 个字节并从三个 IP 设备中的每一个获得 4 个字节作为应答。

我认为问题是我没有延迟地为三个不同的 IP 设备发送 UDP 数据包,所以来自 IP 的应答不按顺序。 但是 indy 的 sendbuffer() 方法在接收之前是阻塞的,所以我不明白。

谁能解释一下 scenarios/conditions 是什么导致了这种行为?

当使用 TIdUDPClient 以串行方式向不同主机发送数据包时 - 使用我使用的通信方法 - 从不同主机接收到的数据包可以相互 'interfere' 。 UDP 是一种无连接协议,因此没有任何机制可以保证接收数据包(与发送数据包不同步)或应答远程主机的正确顺序。

为了分离远程主机接收到的数据包,可能的解决方案是(感谢 Remy Lebeau):

  • 正在检查接收到的与发送数据包对应的远程 IP 的数据包。
  • 将 IdUDPClient 连接到远程 IP。 (IdUDPClient.binding 然后 IdUDPClient.Connect)
  • 使用 IdUDPServer 发送数据包,读取事件处理程序中的答案 OnUDPRead

(但无法保证从同一远程主机接收到的数据包的正确顺序,但现在这不是我的目标)。