Операция чтения 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/ порта.