Это определенно возможно.
Re "UDP или multicast", вы говорите о яблоках и апельсинах. Многоадресная передача - это концепция IP, поэтому вы можете счастливо использовать UDP для многоадресного IP или для широковещательного IP.
Если у вас все в порядке с ограничением наличия у всех клиентов локальной связи (маршрутизаторы и т. Д., Как правило, не пересылают широковещательные пакеты), я бы сказал, просто перейдите к широковещательной передаче. TIdUdpBase.Broadcast будет вашим другом здесь.
Обновление: При многоадресной или широковещательной рассылке вы можете привязать только один сокет к любой конкретной паре IP / порт. Таким образом, если вы хотите, чтобы несколько клиентов слушали ОДНУ ЖЕ широковещательную / многоадресную рассылку, я думаю, вам понадобится дополнительный клиент-диспетчер. Этот диспетчерский клиент получает широковещательные сообщения и уведомляет каждого клиента на компьютере.
В каждом из ваших клиентов у вас есть небольшая процедура регистрации, которая гласит: «Попробуйте связать с портом, на который отправляются широковещательные сообщения. Если вы можете, настройте клиент-диспетчер на этом порту. Если вы не можете, диспетчер уже создал и зарегистрируйте себя в этом диспетчере. "
Этот процесс регистрации может быть таким же простым, как привязка к любому доступному порту на локальном IP-адресе и указание диспетчеру «Пожалуйста, отправляйте широковещательные рассылки на этот IP-порт.»
Обновление: Кристофер Чейз имеет правильную идею. Я только что закончил почти то же самое решение, что и его, за исключением того, что я исправил IdIPMCastClient, добавив свойство ReuseAddr: Boolean и изменив TIdIPMCastClient.GetBinding, добавив
if Self.ReuseAddr then begin
SetReuseAddr := Id_SO_True;
Bindings[i].SetSockOpt(Id_SOL_SOCKET, Id_SO_REUSEADDR, @SetReuseAddr, Sizeof(SetReuseAddr));
end;
между вызовами AllocateSocket и Bind (где SetReuseAddr: Integer).