通过TCP进行广播是否可行?

16

我正在使用C语言编写基于TCP连接的服务器/客户端系统,使用的是BSD套接字。服务器是多线程的,每个连接都在自己的接收器中运行。每个客户端与服务器之间的一对一通信都很好,但不幸的是,我无法想出一种实现SendToAll()函数的方法,例如,如果客户端A执行某些需要向所有客户端发送数据包的操作。我该如何做?

我正在考虑在每个接收器中实现一个队列,并将任何广播消息发送到这些队列; 当接收器发送新数据包时,还会将该消息添加到数据包中,如果这有意义的话。

但是,是否有办法通过TCP进行广播,就像可以通过UDP进行广播一样?


1
你将如何接收ACK数据包? - Ignacio Vazquez-Abrams
4个回答

16

众所周知,TCP不支持组播,仅支持单播。但是有一些可靠的组播实现,可以为您提供具有TCP可靠性的组播服务。请参见维基百科,特别是实用通用组播协议


8
没有,举个例子,如果你想和多个人交流,窗口大小的概念以及如何调整就变得毫无意义。可能会有一种新的协议,它共享了TCP的许多属性,同时允许多播。但我认为这将是非常棘手的。例如,接收者接收数据的速度将受到最慢接收者限制的约束。发送方必须管理缓冲区空间,以便即使最慢的接收者也可以获得必要的重传。不,我认为用于多播的协议总是需要非常特殊目的并专注于手头的确切问题。类似于TCP的通用解决方案是不可行的。有一些方法可以进行可靠的多播大数据传输。基本思路是使用纠错码来连续传输信息,形成一种循环。然后接收者只需开始接收数据包,直到它们收集足够的数据以重建原始文件。但是这些方法似乎并不适合您的情况。

1
@dreamlax - 很有趣。我知道可靠的多播大数据传输方案的想法。这包括使用擦除码并在循环中进行重新传输。这样,接收者可以从中间开始接收并持续接收,直到他们获得足够的数据来重建整个文件。 - Omnifarious

2

您的SendToAll()需要遍历所有打开的套接字,并独立地向每个套接字写入数据。

广播和多播仅限于UDP套接字。


5
并不完全准确,还有其他协议允许多播和广播,例如PGM - dreamlax

2
考虑查看叠加网络,或者只需使用提供发布语义的消息中间件,例如ØMQ,它还方便地提供了BSD套接字API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接