2012-05-11 159 views
2

我需要讀取電子設備發送的信息(使用UDP協議)。我在使用Delphi 7中的Indy組件(版本9)時遇到了問題。下面你可以看到我的代碼。Delphi Indy IdUdpClient讀取操作,沒有返回數據

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,obviusly,「緩衝」的內容是不是我所期望......我在做什麼錯?

由於提前,

了Imanol

回答

3

使用TIdUDPClient你的方式,你正在創建的遠程192.168.1.1:49152對和任何隨機本地IP /端口對TIdUDPClient結合之間的靜態關聯。只能接收從192.168.1.1:49152發送到該IP /端口的數據包。設備需要知道將數據包發送到哪裏,並且您需要在發送到它們的IP /端口上接收它們。我不記得的副手,如果TIdUDPClient在印第安納波利斯9 BoundIPBoundPort性能,但它在印第安納波利斯10

ReceiveTimeout確實以毫秒爲單位表示。即使您已經正確設置了TIdUDPClient,50ms等待數據到達的時間很短,因此ReceiveBuffer()可能只是超時。嘗試使用較大的超時值,至少需要幾秒鐘。

或者,也可以使用TIdUDPServer。使用您希望接收數據的本地IP /端口對設置其Bindings屬性,然後讓其OnUDPRead事件告訴您何時從任何遠程IP /端口接收到新數據。

+0

不幸的是印第安納波利斯9個doesn't有BoundIp和BoundPort屬性... – user1361263

+0

...所以我將不得不使用印10或使用UDP服務器 – user1361263