似乎无法找到关于此的任何信息,但是,TIdUDPServer.OnRead事件是否传递了进入AData数组的所有内容?
根据WireShark的读数,我缺少42字节的数据;虽然我应该在每次读取时获得572个字节的数据,但AData大小始终为530,并且似乎总是缺少相同的字节。
发送数据的设备正在广播它,我可以得到我需要的所有东西,除了2个字节,这似乎是缺少的2个字节。
有关此问题的任何提示吗?
编辑:
我应该提到这些是前42个字节;之后的一切都很好;
答案 0 :(得分:2)
OnUDPRead
事件传递套接字从OS接收的所有内容。 UDP对消息进行操作。与TCP不同,UDP读取是一种全有或全无操作,无论是读取整个UDP消息还是发生错误,都没有介于两者之间。
如果您缺少数据,则操作系统不提供数据(例如,它是否属于UDP和/或IP标头),或者您没有正确读取AData
参数中的数据。如果您认为不是这种情况,那么您需要更新您的问题以显示您的实际OnUDPRead
处理程序代码,示例WireShark转储显示从网络捕获的数据,以及正在向您发送数据的数据OnUDPRead
处理程序。
更新:操作系统不提供对数据包标头的访问(除非您使用的是TIdUDPServer
不使用的RAW套接字,但这是另一个讨论主题)。 AData
事件的OnUDPRead
参数仅提供数据包的应用程序数据部分,因为这是操作系统提供的部分。您无法访问数据包标题。
话虽这么说,您可以通过ABinding.PeerIP
事件的ABinding.PeerPort
和OnUDPRead
属性获取数据包的源IP:Port。但是,除非您自己嗅探网络,例如使用pcap库,否则无法检索其他数据包标头值(在大多数情况下也不需要它们)。