PDA

Ver la Versión Completa : Recibir múltiples respuestas en TIdUDPClient después de un BroadCast


gluglu
29-07-2011, 10:31:42
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 :
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 :
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: