2

我需要读取电子设备发送的信息(使用 UDP 协议)。我在 Delphi 7 中使用 Indy 组件(版本 9)时遇到问题。您可以在下面看到我的代码。

procedure TForm1.Button1Click(Sender: TObject);
var
  buffer: Array of Byte;
  bytes_received: integer;
begin
  SetLength(buffer, 36);
  IdUDPClient1.Host:='192.168.1.1';
  IdUDPClient1.Port:=49152;
  IdUDPClient1.BufferSize:=36;

  IdUDPClient1.Active:=True;
  IdUDPClient1.ReceiveTimeout:=50;
  bytes_received:=IdUDPClient1.ReceiveBuffer(buffer,Sizeof(buffer));
  IdUDPClient1.Active:=False;
end

“bytes_received”的输出值为 0,显然,“buffer”的内容不是我所期望的……我做错了什么?

提前致谢,

伊莫诺

4

1 回答 1

3

使用TIdUDPClient您的方式,您正在远程192.168.1.1:49152对与TIdUDPClient绑定到的任何随机本地 IP/端口对之间创建静态关联。只能接收从192.168.1.1:49152该 IP/端口发送的数据包。设备需要知道将数据包发送到哪里,并且您需要在它们发送到的 IP/端口上接收它们。我不记得Indy 9 中的TIdUDPClienthasBoundIPBoundPortproperties,但在 Indy 10 中确实如此。

ReceiveTimeout以毫秒表示。即使您已TIdUDPClient正确设置,50ms 也是等待数据到达的非常短的时间,因此ReceiveBuffer()可能只是超时。尝试使用更大的超时值,至少需要几秒钟。

或者,TIdUDPServer改为使用。使用您想要接收数据的本地 IP/端口对设置其Bindings属性,然后让其OnUDPRead事件在新数据从任何远程 IP/端口到达时告诉您。

于 2012-05-11T15:25:27.480 回答