Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缓冲区数组中IdUDPServer.OnRead事件缺少字节-Delphi XE3_Delphi_Udp_Delphi Xe3_Indy10 - Fatal编程技术网

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

缓冲区数组中IdUDPServer.OnRead事件缺少字节-Delphi XE3,delphi,udp,delphi-xe3,indy10,Delphi,Udp,Delphi Xe3,Indy10,似乎在任何地方都找不到关于此的信息,但是,TIdUDPServer.OnRead事件是否将传入AData数组的所有内容都传递给AData数组 根据WireShark的读数,我丢失了42字节的数据;虽然每次读取时我应该得到572字节的数据,但AData的大小总是530字节,似乎总是缺少相同的字节 发送数据的设备正在广播数据,我可以得到我所需要的一切,除了2个字节,这似乎是丢失的2个字节 关于这个有什么提示吗 编辑: 我应该提到的是,这些是最早的42个字节;之后的一切都被罚款 OnUDPRead事件

似乎在任何地方都找不到关于此的信息,但是,TIdUDPServer.OnRead事件是否将传入AData数组的所有内容都传递给AData数组

根据WireShark的读数,我丢失了42字节的数据;虽然每次读取时我应该得到572字节的数据,但AData的大小总是530字节,似乎总是缺少相同的字节

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

关于这个有什么提示吗

编辑:


我应该提到的是,这些是最早的42个字节;之后的一切都被罚款

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

如果您缺少数据,则可能是操作系统没有提供数据(例如,它是否属于UDP和/或IP头),或者您没有正确地从
AData
参数读取数据。如果您认为情况并非如此,则需要更新您的问题,以显示实际的
OnUDPRead
处理程序代码,一个示例WireShark转储,显示从网络捕获的数据,以及将其发送到
OnUDPRead
处理程序的数据

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


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

我知道它可以接收操作系统转发的任何数据包,但不知道in只接收整个数据包或什么也不接收。。是的,这42个字节是报头数据,承载源的MAC、IP地址、协议信息、数据包长度等。。。但是为什么他们没有被传下去呢…?谢谢你的解释和批准。不知道无法访问标头。我知道PeerIP和PeerPort,但我还需要其他的。。。我将检查pcap库,看看我是否可以通过嗅探网络四处走动……你不应该在意数据包是否被广播。它以某种方式指向您的侦听端口。如果数据包不符合您的套接字标准,操作系统将不会将其提供给您。你知道目的港,因为你是第一个打开它的人。您始终知道套接字正在侦听的端口。至于验证发送者Mac,这些很容易被欺骗,所以不用费心去尝试。改为验证数据包有效负载的内容。如果需要验证发件人,则需要事先让发件人与您进行身份验证。不能让套接字侦听多个端口。它可以侦听多个本地IP,但不能侦听多个端口。唯一的方法是为每个要侦听的端口创建一个单独的套接字。鉴于此,您总是知道哪个端口接收到数据包(
ABinding.IP
ABinding.port
属性告诉您接收IP:port,而
ABinding.PeerIP
ABinding.PeerPort
属性告诉您发送IP:port)。您将无法使用套接字API接收和验证Mac。这些信息仅由网络层使用,而不是应用层。但是,如果您确实想检查数据包是发送到广播IP还是特定IP,可以使用
recvmsg()
WSARecvMsg()
在Windows上),它提供此类信息,例如目标IP地址。Indy有一个返回dest IP的
TIdStack.ReceiveMsg()
方法(除其他外),但是您不能将它与
TIdUDPServer
一起使用(因为它使用
TIdStack.ReceiveFrom()
),而不更改Indy的源代码。