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

zc0qhyus  于 2023-03-17  发布在  其他
关注(0)|答案(5)|浏览(423)

我正在用C编写一个服务器/客户端系统,它在TCP连接下使用BSD套接字。服务器是多线程的,每个连接都在自己的接收器中运行。每个客户端都能很好地与服务器进行一对一的对话,遗憾的是我想不出实现SendToAll的方法()函数,例如,如果客户端A执行某项操作,需要向所有客户端发送一个数据包,我该怎么做呢?
我考虑在每个接收器中实现一个队列,任何广播都被发送到这些队列;当接收器发出新的分组时,如果有意义的话,它也将该消息添加到分组上。
但是,有没有办法通过TCP广播,就像通过UDP一样?

cedebl8k

cedebl8k1#

正如每个人都说的那样,TCP不可能做到这一点,它只能是单播。然而,有一些可靠的多播实现,它应该给予你提供TCP可靠性的多播。参见wikipedia,特别是Pragmatic General Multicast

l7mqbcuq

l7mqbcuq2#

不,没有。例如,如果你试图与多方通话,窗口大小的概念以及如何调整窗口大小就变得毫无意义。
创建一个新的协议,共享TCP的许多属性,同时允许多播是可能的。但我认为这将是一个很大的问题。例如,接收者接收数据的速度将受到最慢接收者的限制。发送者必须管理缓冲区空间,以便即使是最慢的接收者也能在必要时获得重新传输。
不,我认为多播协议总是要有非常特殊的用途,并且集中在手头的确切问题上。一些通用的和类似TCP的协议是不可行的。
有很多方法可以实现可靠的多播批量数据传输,基本思想是使用erasure codes在一个循环中连续传输信息,然后接收者可以开始接收数据包,直到他们有足够的数据来重建原始文件。
但这些似乎并不完全符合你的情况。

yshpjwxd

yshpjwxd3#

SendToAll()需要迭代所有打开的套接字,并将数据独立地写入每个套接字。
广播和多播仅限于UDP套接字。

yebdmbv4

yebdmbv44#

考虑一下overlay networks,或者简单地使用提供发布语义的消息传递中间件,例如ØMQ,它还方便地提供了BSD套接字API。

相关问题