Delphi Indy IdUdpClient读操作,没有返回数据

时间:2012-05-11 11:25:22

标签: delphi delphi-7 indy udpclient indy-9

我需要读取电子设备发送的信息(使用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,显然,“缓冲”内容不是我所期望的......我做错了什么?

提前致谢,

了Imanol

1 个答案:

答案 0 :(得分:3)

使用TIdUDPClient的方式,您将在远程192.168.1.1:49152对与TIdUDPClient绑定的任意随机本地IP /端口对之间创建静态关联。只能接收从192.168.1.1:49152发送到该IP /端口的数据包。设备需要知道将数据包发送到哪里,您需要在发送到的IP /端口上接收它们。如果{9}在Indy 9中TIdUDPClient具有BoundIPBoundPort属性,我不会立即回想起来,但它确实存在于Indy 10中。

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

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