Операция чтения Delphi Indy IdUdpClient, данные не возвращены

Мне нужно прочитать информацию, которая отправляется электронным устройством (по протоколу UDP). У меня проблемы с использованием компонентов Indy (версия 9) в Delphi 7. Ниже вы можете увидеть мой код.

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 ответ

Решение

С помощью TIdUDPClient так, как вы, вы создаете статическую связь между удаленным 192.168.1.1:49152 пара и все случайные локальные пары IP/ порт, которые TIdUDPClient привязывается к. Только отправленные пакеты 192.168.1.1:49152 на этот IP/ порт можно получить. Устройство должно знать, куда отправлять свои пакеты, и вам нужно получать их по IP/ порту, на который они отправляются. Я не припомню, если TIdUDPClient имеет BoundIP а также BoundPort свойства в Indy 9, но это делает в Indy 10.

ReceiveTimeout выражается в миллисекундах. Даже если у вас есть TIdUDPClient 50 мс - это очень короткий промежуток времени для ожидания поступления данных, поэтому ReceiveBuffer() может быть просто время ожидания. Попробуйте использовать большее значение тайм-аута, по крайней мере, за несколько секунд.

В качестве альтернативы используйте TIdUDPServer вместо. Настройте его Bindings свойство с парой локальных IP/ портов, по которым вы хотите получать данные, а затем OnUDPRead Событие сообщит вам, когда новые данные поступают с любого удаленного IP/ порта.

Другие вопросы по тегам