这绝对是可能的。
关于“UDP 或多播”,您说的是苹果和橘子。多播是一个 IP 概念,因此您可以愉快地通过多播 IP 或广播 IP 进行 UDP。
如果您对让所有客户端链接本地(路由器等通常不转发广播数据包)的限制感到满意,我会说只使用广播。TIdUdpBase.Broadcast 将成为您的朋友。
更新:使用多播或广播,您只能将一个套接字绑定到任何特定的 IP/端口对。因此,如果您希望多个客户端都收听相同的广播/多播,我认为您将需要一个额外的调度程序客户端。此调度程序客户端接收广播并通知机器上的每个客户端。
在您的每个客户端中,您都有一个小的注册程序,上面写着“尝试绑定到发送广播的端口。如果可以,请在该端口上设置调度程序客户端。如果不能,调度程序已经创建,并且向那个调度员登记。”
该注册过程可以简单到绑定到本地主机 IP 上的任何可用端口,然后对调度程序说“请向此 IP/端口发送广播”。
更新: Christopher Chase的想法是正确的。我刚刚完成了与他几乎完全相同的解决方案,除了我修补了 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)。