缓冲区数组中的IdUDPServer.OnRead事件中缺少字节 - Delphi XE3

时间:2014-11-16 22:55:23

标签: delphi udp delphi-xe3 indy10

似乎无法找到关于此的任何信息,但是,TIdUDPServer.OnRead事件是否传递了进入AData数组的所有内容?

根据WireShark的读数,我缺少42字节的数据;虽然我应该在每次读取时获得572个字节的数据,但AData大小始终为530,并且似乎总是缺少相同的字节。

发送数据的设备正在广播它,我可以得到我需要的所有东西,除了2个字节,这似乎是缺少的2个字节。

有关此问题的任何提示吗?

编辑:

我应该提到这些是前42个字节;之后的一切都很好;

1 个答案:

答案 0 :(得分:2)

OnUDPRead事件传递套接字从OS接收的所有内容。 UDP对消息进行操作。与TCP不同,UDP读取是一种全有或全无操作,无论是读取整个UDP消息还是发生错误,都没有介于两者之间。

如果您缺少数据,则操作系统不提供数据(例如,它是否属于UDP和/或IP标头),或者您没有正确读取AData参数中的数据。如果您认为不是这种情况,那么您需要更新您的问题以显示您的实际OnUDPRead处理程序代码,示例WireShark转储显示从网络捕获的数据,以及正在向您发送数据的数据OnUDPRead处理程序。

更新:操作系统不提供对数据包标头的访问(除非您使用的是TIdUDPServer不使用的RAW套接字,但这是另一个讨论主题)。 AData事件的OnUDPRead参数仅提供数据包的应用程序数据部分,因为这是操作系统提供的部分。您无法访问数据包标题。

话虽这么说,您可以通过ABinding.PeerIP事件的ABinding.PeerPortOnUDPRead属性获取数据包的源IP:Port。但是,除非您自己嗅探网络,例如使用pcap库,否则无法检索其他数据包标头值(在大多数情况下也不需要它们)。