2012-05-11 2 views
2

Мне нужно прочитать информацию, отправленную электронным устройством (используя протокол UDP). У меня возникают проблемы с использованием компонентов Indy (версия 9) в Delphi 7. Ниже вы можете увидеть мой код.Операция чтения 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/Port парой, которая TIdUDPClient связывается. Только пакеты, отправленные с 192.168.1.1:49152 на этот IP/порт, могут быть получены. Устройство должно знать, куда отправлять свои пакеты, и вам нужно получить их на IP-порт, на который они отправлены. Я не помню навскидку, если TIdUDPClient имеет BoundIPBoundPort и свойства в Indy 9, но это в Indy 10.

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

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

+0

Unfortunatly Indy 9 не имеет свойств BoundIp и BoundPort ... – user1361263

+0

... поэтому мне придется использовать Indy 10 или использовать UDP-сервер – user1361263

 Смежные вопросы

  • Нет связанных вопросов^_^