2012-05-11 4 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, "버퍼"내용이없는 내가 기대하는 것입니다 ... 어떻게 내가 잘못하고 있는가? TIdUDPClient 당신이 방법을 사용하여 사전에

감사합니다,

Imanol

답변

3

, 당신은 원격 192.168.1.1:49152 쌍 어떤 TIdUDPClient가 결합하는 것을 임의의 로컬 IP가/포트 쌍 사이의 정적 연결을 만들 수 있습니다. 192.168.1.1:49152에서 해당 IP/포트로 보낸 패킷 만 수신 할 수 있습니다. 장치는 패킷을 보낼 위치를 알아야하며 패킷을 보내려는 IP/포트에서 패킷을 받아야합니다. TIdUDPClient는 인디 9 BoundIPBoundPort 특성을 가지고 있다면이 렇게 나 기억하지 않습니다, 그러나 그것은 밀리 초 단위로 표현된다 인디 (10)

ReceiveTimeout에 않습니다. TIdUDPClient이 제대로 설정 되더라도 데이터가 도착할 때까지 50ms는 매우 짧은 시간이기 때문에 ReceiveBuffer()은 시간이 초과 될 수 있습니다. 적어도 몇 초의 가치가있는 더 큰 제한 시간 값을 사용해보십시오.

대신 TIdUDPServer을 사용하십시오. Bindings 속성을 데이터를 수신 할 로컬 IP/포트 쌍으로 설정 한 다음 OnUDPRead 이벤트가 원격 IP/포트에서 새 데이터가 도착할 때마다 알려줍니다.

+0

불행히도 Indy 9에는 BoundIp 및 BoundPort 속성이 없습니다 ... – user1361263

+0

... 인디 10을 사용해야하거나 UDP 서버를 사용해야합니다. – user1361263