我需要想出可以可靠地多播到其他客户端的客户端。这意味着我将使用 TCP 在多播组内的客户端之间进行可靠连接。这不是 n^2 连接数吗?这对我来说似乎有点傻。难道/不应该有一种更容易可靠地多播的方法吗?
编辑:UNIX/C
编辑:我没有澄清多线程是如何发挥作用的。但如果我要打开 n^2 个连接,我想,我会是多线程的,这比我想要的更复杂。
我需要想出可以可靠地多播到其他客户端的客户端。这意味着我将使用 TCP 在多播组内的客户端之间进行可靠连接。这不是 n^2 连接数吗?这对我来说似乎有点傻。难道/不应该有一种更容易可靠地多播的方法吗?
编辑:UNIX/C
编辑:我没有澄清多线程是如何发挥作用的。但如果我要打开 n^2 个连接,我想,我会是多线程的,这比我想要的更复杂。
您需要看一下0MQ,它是一个高速消息传递系统,它具有使用OpenPGM的Pragmatic General Multicast (PGM)可靠多播的能力之一。
最近在lwn.net上有一篇关于它的文章:
根据您的目标平台......
你可以看看Pragmatic General Multicast。据我了解,这是 Microsoft MSMQ 和 Tibco Rendezvous 使用的,可以通过 Winsock 访问(请参阅:http: //msdn.microsoft.com/en-us/library/ms740125 (VS.85).aspx )。
多播和 TCP 是互斥的。
通过 UDP 实现可靠的交付是疯狂的。自 1980 年代以来没有人这样做,而且就性能和 BW 开销而言,不可能像任何廉价的 TCP 堆栈一样好。更正:有时它是手动完成的,但仅限于特殊运输,例如极长或极窄的管道。
N^2 个连接不是很傻。与 1Hz keepalives 的连接不会花费太多。费用是流量。这是您的设计需要关注的内容。
如上所述,PGM 是一种选择。我们遇到的问题是,如果客户端无法跟上读取传入数据的速度,它就会断开连接。
由于我们永远无法可靠地保证“足够快”的客户端,因此我们在 UDP 多播之上实现了我们自己的可靠性协议。当涉及到动态连接/断开连接时,该实现并不完全通用,但它可能对您有用。你可以在这里找到实现:
http://www.equalizergraphics.com/cgi-bin/viewvc.cgi/trunk/src/lib/net/rspConnection.h?view=markup http://www.equalizergraphics.com/cgi-bin/viewvc.cgi /trunk/src/lib/net/rspConnection.cpp?view=markup
当然还有一种更有效的方法——您继续使用 UDB,并自己重新实现可靠发送。不过,这不是微不足道的。但至少你只需要在发送站点上保存一次发送的数据包。
只是一个想法,但是您的工作是否需要使用网络协议来完成。您还可以考虑使用基于发布-订阅的模型的消息服务来实现这一点。
如果您确实需要网络,那么您将不得不处理大量连接,或者确保自己交付。在走这条路之前,请确保您的要求。