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


似乎

找不到有关此内容的任何信息,但是,TIdUDPServer.OnRead 事件是否传递到 AData 数组的所有内容?

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

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

对此有什么提示吗?

编辑:

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

OnUDPRead 事件传递套接字从操作系统接收的所有内容。 UDP 对消息进行操作。与TCP不同,UDP读取是一个全有或全无的操作,要么读取整个UDP消息,要么发生错误,中间没有

如果缺少数据,则操作系统未提供数据(例如,如果它属于 UDP 和/或 IP 标头),或者您未正确读取AData参数中的数据。 如果您认为情况并非如此,则需要更新问题以显示实际的OnUDPRead处理程序代码、显示从网络捕获的数据的示例 WireShark 转储以及进入OnUDPRead处理程序的数据。

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

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

最新更新