Indy IdUDPClient.sendbuffer - 接收缓冲区

时间:2017-06-22 08:19:25

标签: delphi udp indy

我使用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()方法阻止,直到收到所以我不明白。

有人可以解释哪些情景/条件会导致这种行为吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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