【问题标题】:c++ send data to multiple UDP socketsc ++将数据发送到多个UDP套接字
【发布时间】:2009-10-24 00:22:25
【问题描述】:
我有一个 c++ 非阻塞服务器套接字,所有客户端都存储在 std::map 结构中。
我可以为每个 clientObject 调用 send() 方法来向连接的客户端发送一些东西,这已经很好了。
但是为了向所有人发送消息(广播?)我想知道:
有什么比对所有客户端执行 for/loop 并在每次迭代中调用 ClientObject->send("foo") 更好的方法?
或者我应该尝试查看多播套接字吗?
提前致谢。
抹布。
【问题讨论】:
标签:
c++
sockets
broadcast
【解决方案1】:
仅当您通过 LAN 进行通信时,多播才是一种选择。它无法通过 Internet 运行。
您可能想要在这里做的是使用异步 I/O 对套接字进行多路分解。这允许您同时向多个套接字发送数据,并使用异步事件处理程序来处理每个传输。
我建议您研究 Boost ASIO 以获得一种可移植的方式来执行此操作。您也可以使用特定于操作系统的系统调用(例如 UNIX 上的 poll/select 或 Linux 上的 epoll)来执行此操作,但要复杂得多。
【讨论】:
-
组播可以在 Internet 上运行,但要考虑到一些限制和一些通常被大多数网络管理员忘记的正确路由器配置。举个例子,您可以通过组播收听 BBC 的高品质广播或观看高品质电视:bbc.co.uk/multicast
【解决方案2】:
多播会更可取...只要您谈论的是本地节点,即在 LAN 上的“广播/多播”域内。
当然,有用于更广泛地分散此类消息的多播分发协议,但它们很少使用,并且根据您的具体情况,您可以/不可以依赖于此类设施的可靠性。
从发送方的角度来看,使用多播可以节省大量成本:只需进行一次发送操作,而不是 n*send。
【解决方案3】:
除非您有那些非常昂贵的交换机,否则您最好对每个主机进行 udp 单播。是的,对于大多数 CPU 比你的电脑更弱的交换机来说,广播/多播实际上可能会更慢。除了简单的转发之外,其他任何操作都会大大减慢它们的速度。
做一个基准来找出答案。