Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Redes (https://www.clubdelphi.com/foros/forumdisplay.php?f=37)
-   -   Recibir múltiples respuestas en TIdUDPClient después de un BroadCast (https://www.clubdelphi.com/foros/showthread.php?t=75112)

gluglu 29-07-2011 11:31:42

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 :rolleyes:


La franja horaria es GMT +2. Ahora son las 04:17:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi