TCP多播和多线程

时间:2010-03-16 09:09:21

标签: multithreading tcp multicast

我需要提出可以可靠地多播到其他客户端的客户端。这意味着我将使用TCP在多播组内的客户端之间可靠地连接。这不是n ^ 2连接数?这对我来说似乎有点傻。不会/不应该有一种方法可以更容易地组织可靠性吗?

编辑:UNIX / C

编辑:我没有说明多线程是如何发挥作用的。但如果我打开n ^ 2个连接,我想,我会多线程,这比我想要的更复杂。

7 个答案:

答案 0 :(得分:4)

有几种可靠的组播解决方案。

我尝试了前两个。

Norm很简单,就像标准的udp组播一样,但是如果你不需要更多的东西,那就是nacks ......非常好。有一些实现还支持带宽适应和其他改进。

DDS向前迈进了一步。它真的很棒(我知道RTI实现并且效果很好)并且具有很多功能以及非常好的设计。它基于可靠和容错,并且有一个open implementation

顺便说一下,至少DDS和NORM不需要n ^ 2个连接。它们像多播udp一样工作。

答案 1 :(得分:2)

取决于您的目标平台......

您可以查看Pragmatic General Multicast。据我所知,这是Microsoft MSMQ和Tibco Rendezvous使用的内容,可以通过Winsock访问它(参见:http://msdn.microsoft.com/en-us/library/ms740125(VS.85).aspx)。

答案 2 :(得分:2)

您需要查看0MQ这是一个高速消息系统,它使用Pragmatic General Multicast (PGM) OpenPGM使用0MQ: A new approach to messaging作为其中一项可靠的多播功能。

最近在lwn.net上有一篇文章:

{{3}}

答案 3 :(得分:1)

组播和TCP是互斥的。

通过UDP实现可靠的交付是疯狂的。自20世纪80年代以来,没有人这样做,就性能和BW开销而言,不可能像任何廉价的TCP堆栈一样好。更正:有时它是手动完成的,但仅限于异国情调的运输,例如极长或狭窄的管道。

N ^ 2连接不是很傻。与1Hz keepalive的连接不会花费太多。流量是多少。这就是您的设计需要关注的内容。

答案 4 :(得分:0)

当然有一种更有效的方法 - 您继续使用UDB,并重新实现可靠的发送自己。但不是微不足道的。但至少你只需要在发送站点保持发送的数据包ONCE。

答案 5 :(得分:0)

如上所述,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

答案 6 :(得分:0)

只是一个想法,但你的工作需要用网络协议来完成。您还可以考虑使用基于发布 - 订阅的模型的消息服务来实现它。

如果您确实需要联网,那么您将不得不处理大量连接或确保自己交付。在走这条路之前,请确保您的要求。