在 PC 中接收由硬件发送的 UDP 数据,

receiving UDP data in PC that send by hardware,

我开发了一个硬件(client,src ip 192.168.01.200 :9652, des ip 192.168.01.100 :9652),可以回复来自pc的ARP和ICMP请求并发送UDP帧,我可以检查UDP帧, ARP 和 icmp 在 wireshark 中回复,所有这些帧都正常,但我无法在我的软件中收到任何东西,

在 pc 端(服务器)我设置了 ip 地址 192.168.01.100 并编写了 delphi 代码用于使用 indy10 接收 udp 帧,然后我检查 On_udp_read 接收数据的事件但是此事件从未发生,

服务器(pc):

  udpserver.Active := True;
  binding:=udpserver.bindings.add;
  binding.IP:= '192.168.01.100'; // my computer IP
  binding.Port:=9652;

您需要在激活服务器之前设置Bindings集合,而不是之后:

//udpserver.Active := True;
binding := udpserver.Bindings.Add;
binding.IP := '192.168.01.100';
binding.Port := 9652;
udpserver.Active := True; // <-- move down here

如果在激活服务器时 Bindings 集合为空,它将创建一个绑定到 IP 0.0.0.0 (IPv4) 或 ::1 (IPv6) 的默认项TIdUDPServer.DefaultPort,默认为 0。所以你最终会绑定到一个随机的 OS 分配的端口,除非你事先设置 DefaultPort,例如:

udpserver.DefaultPort := 9652;
udpserver.Active := True;