E 'sicuramente possibile.
Re "UDP o multicast", stai parlando di mele e arance. Multicast è un concetto IP, quindi puoi felicemente UDP su IP multicast o su IP broadcast.
Se si sta bene con la limitazione di avere tutti i client link-local (i router ecc. In genere non inoltrano pacchetti di trasmissione), direi semplicemente andare con broadcast. TIdUdpBase.Broadcast sarà tuo amico qui.
Aggiornamento: Con multicast o broadcast, si può avere un solo legame socket con qualsiasi particolare coppia IP/porta. Quindi, se vuoi che più client ascoltino tutti la trasmissione/multicast SAME, penso che avrai bisogno di un client di dispatcher in più. Questo client del dispatcher riceve le trasmissioni e notifica ogni client sulla macchina.
All'interno di ciascun client è presente una piccola procedura di registrazione che dice "Prova a collegarsi alla porta a cui sono inviate le trasmissioni. Se è possibile, impostare un client di dispatcher su quella porta. già creato e registrati a quel dispatcher. "
Questo processo di registrazione potrebbe essere semplice come il binding a qualsiasi porta disponibile sull'IP localhost e dire al dispatcher "Si prega di inviare trasmissioni a questo IP/porta".
Aggiornamento:Christopher Chase ha l'idea giusta. Ho appena finito di quasi la stessa soluzione esatta come la sua, tranne che mi patchato IdIPMCastClient, l'aggiunta di una ReuseAddr immobile: booleana e cambiando TIdIPMCastClient.GetBinding aggiungendo
if Self.ReuseAddr then begin
SetReuseAddr := Id_SO_True;
Bindings[i].SetSockOpt(Id_SOL_SOCKET, Id_SO_REUSEADDR, @SetReuseAddr, Sizeof(SetReuseAddr));
end;
tra le chiamate a AllocateSocket e Bind (dove SetReuseAddr: Integer).
fonte
2010-04-12 14:35:31
Eccellente, SO_REUSEADDR questo è il suggerimento che mi serviva –
su Mac OSX, ho dovuto aggiungere: 'sock.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEPORT, true)' –