Ver Mensaje Individual
  #1  
Antiguo 29-07-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Reputación: 21
gluglu Va por buen camino
Recibir múltiples respuestas en TIdUDPClient después de un BroadCast

Hola amig@s !

Me gustaría poder clarificar una duda que tengo.

Lanzo un BroadCast desde un TIdUDPClient para que las diferentes instancias de mi programa que se estén ejecutando en los diferentes puestos de una red local, me devuelvan un valor (en este caso el del código del puesto de trabajo que ejecutan).

Cómo debería de gestionar correctamente las diferentes respuestas que recibo para tener 'controladas' todas las respuestas que me van a enviar los diferentes TIdUDPServer's ??

Estoy haciendo pruebas, y me he creado un Memo donde voy mostrando las diferentes respuestas que obtengo.

El código actual del UDPClient es :
Código Delphi [-]
UdpClient.Broadcast('UDP_REQUEST_POSITIONS', 50000);
Aux_S1 := UDPClient.ReceiveString();
if Aux_S1 = '' then
  UDPMemo.Lines.Add('No se recibió respuesta transcurridos ' + IntToStr(UDPClient.ReceiveTimeout) + ' milisegundos.')
else begin
  UDPMemo.Lines.Add('Cadena Recibida: ' + Aux_S1);
  if Copy(Aux_S1, 1, 19) = 'UDP_REPLY_POSITIONS' then
    UDPMemo.Lines.Add('Puesto que ha respondido : ' + Copy(Aux_S1, 21, 6));
end;

De hecho, me funciona correctamente con las posibilidades para probar que tengo aquí mismo, que son dos ordenadores.

En el UDPMemo me aparecen correctamente que me responden (p.ej.) el puesto 1 y el puesto 2.

Pero quiero tener la seguridad que lo estoy haciendo correctamente. Necesito algún bucle adicional que me comprueba algún buffer de lectura en el UDPClient ?? Necesito de alguna comprobación adicional ?? Realmente cómo funciona el UDPClient.ReceiveString() para que pueda gestionar todas las respuestas de manera correcta ?? Si la prueba en vez de realizarla con 2 puestos, la realizara con 100 (... o más) puestos, el código sería el mismo o, refiriéndome a la misma pregunta, debería hacer algún bucle especial que me leyera el buffer de lectura ??

El código que tengo en el evento OnRead del UDPServer es :
Código Delphi [-]
procedure TMainform.UDPServerUDPRead(AThread: TIdUDPListenerThread;
  AData: TIdBytes; ABinding: TIdSocketHandle);
var
  LMsg   : String;
  Aux_S1 : String;
begin
  LMsg := BytesToString(AData, 0, Length(AData));
  UDPMemo.Lines.Add(LMsg);
  if LMsg = 'UDP_REQUEST_POSITIONS' then
    Aux_S1 := 'UDP_REPLY_POSITIONS_' + IntToStr(Gen_Position)
  else
    Aux_S1 := 'Replied from ' + UDPServer.Name;
  ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, Aux_S1, ID_DEFAULT_IP_VERSION);
end;

La versión de Indy que utilizo es la 10.5.8.0.

Gracias por vuestros comentarios
__________________
Piensa siempre en positivo !
Responder Con Cita