我有一个 c++ 非阻塞服务器套接字,所有客户端都存储在 std::map 结构中。
我可以为每个 clientObject 调用 send() 方法来向连接的客户端发送一些东西,这已经很好了。
但是对于向所有人发送消息(广播?)我想知道:有什么比对所有客户端执行 for/loop 并在每次迭代中调用 ClientObject->send("foo") 更好的方法?
还是我应该尝试查看多播套接字?
提前致谢。抹布。
多播会更可取...只要您谈论的是本地节点,即在 LAN 上的“广播/多播”域内。
当然,有用于更广泛地分散此类消息的多播分发协议,但它们很少使用,并且根据您的具体情况,您可以/不可以依赖于此类设施的可靠性。
从发送方的角度来看,使用多播可以节省大量成本:只需进行一次发送操作,而不是 n*send。
仅当您通过 LAN 进行通信时,多播才是一种选择。它不会在 Internet 上运行。
您可能想要在这里做的是使用异步 I/O 对套接字进行多路分解。这允许您同时向多个套接字发送数据,并使用异步事件处理程序来处理每个传输。
我建议您研究 Boost ASIO 以获得可移植的方式来执行此操作。您也可以使用特定于操作系统的系统调用(例如 UNIX 上的 poll/select 或 Linux 上的 epoll)来执行此操作,但要复杂得多。
除非您有那些非常昂贵的交换机,否则您最好对每个主机进行 udp 单播。是的,对于大多数 CPU 比你的电脑更弱的交换机来说,广播/多播实际上可能更慢。除了简单的转发之外,做任何事情都会大大减慢它们的速度。
做一个基准来找出答案。
异步套接字编程绝对是要走的路!:)