Es definitivamente posible.
Re "UDP o multidifusión", estás hablando de manzanas y naranjas. La multidifusión es un concepto de IP, por lo que puede felizmente UDP sobre IP de multidifusión, o sobre IP de difusión.
Si está de acuerdo con la limitación de tener todos los clientes link-local (enrutadores, etc. generalmente no reenvían paquetes de difusión), yo diría que simplemente continúe con la transmisión. TIdUdpBase.Broadcast será tu amigo aquí.
Actualización: Con multidifusión o difusión, solo puede tener un socket vinculado a un par de IP/puerto en particular. Por lo tanto, si desea que varios clientes estén todos escuchando la MISMA transmisión/multidifusión, creo que necesitará un cliente de despachador adicional. Este cliente despachador recibe transmisiones y notifica a todos los clientes en la máquina.
Dentro de cada uno de sus clientes tiene un pequeño procedimiento de registro que dice "Intente vincularse al puerto al cual se envían las transmisiones. Si puede, configure un cliente de despachador en ese puerto. Si no puede, el despachador ya creado, y registrarse en ese despachador ".
Ese proceso de registro podría ser tan simple como vincularlo a cualquier puerto disponible en la IP de localhost, y decirle al despachador "Envíe transmisiones a esta IP/puerto".
Actualización:Christopher Chase tiene la idea correcta. Acabo de terminar casi la misma solución exacta como la suya, excepto remendé IdIPMCastClient, añadiendo un REUSEADDR propiedad: Boolean y cambiando TIdIPMCastClient.GetBinding añadiendo
if Self.ReuseAddr then begin
SetReuseAddr := Id_SO_True;
Bindings[i].SetSockOpt(Id_SOL_SOCKET, Id_SO_REUSEADDR, @SetReuseAddr, Sizeof(SetReuseAddr));
end;
entre las llamadas a AllocateSocket y de enlace (donde SetReuseAddr: entero).
Excelente, SO_REUSEADDR esa es la sugerencia que necesitaba –
En mac OSX, tuve que agregar: 'sock.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEPORT, True)' –