“肯定是可能的。”
关于“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)。
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, True)
- Shane Holloway