我使用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()方法阻止,直到收到所以我不明白。
有人可以解释哪些情景/条件会导致这种行为吗?
答案 0 :(得分:0)
当使用TIdUDPClient
以串行方式将数据包发送到不同主机时 - 通信方法即时使用 - ,来自不同主机的接收数据包可能会相互“干扰”。 UDP是一种无连接协议,因此没有任何机制可以保证接收数据包的正确顺序(与发送的数据包不同步)或应答远程主机。
为了通过远程主机分离收到的数据包,可能的解决方案是(感谢Remy Lebeau):
IdUDPClient.binding
然后IdUDPClient.Connect
)OnUDPRead
中的答案。(但是不保证来自同一远程主机的接收数据包的正确顺序,但是现在这不是我的目标。)