16

我正在用 C 语言编写一个服务器/客户端系统,它在 TCP 连接下使用 BSD 套接字。服务器是多线程的,每个连接都在自己的接收器中运行。每个客户端都很好地与服务器进行一对一的对话,遗憾的是我想不出一种方法来实现 SendToAll() 函数,例如,如果客户端 A 做了一些需要向其发送数据包的事情所有的客户。我该怎么做?

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

但是,是的,有什么方法可以通过 TCP 进行广播,就像您可以通过 UDP 一样?

4

4 回答 4

15

正如每个人所说的那样,TCP 是不可能的,它只是单播。但是,有可靠多播的实现,它应该为您提供具有 TCP 可靠性的多播。请参阅wikipedia,尤其是Pragmatic General Multicast

于 2010-11-28T03:56:53.193 回答
8

不,没有。例如,如果您尝试与多方交谈,窗口大小的概念及其调整方式就变得毫无意义。

有可能创建一个共享 TCP 的许多属性同时允许多播的新协议。但我认为这将是一个很大的问题。例如,接收者接收数据的速度将受到最慢接收者的限制。发送方必须管理缓冲区空间,以便即使是最慢的接收方也可以在必要时重新传输。

不,我认为进行多播的协议总是必须有非常特殊的目的,并专注于手头的确切问题。一些通用的和类似 TCP 的东西是不可行的。

有一些方法可以进行可靠的多播批量数据传输。基本思想是使用纠删码以一种循环的方式连续传输信息。然后接收者可以开始接收数据包,直到他们有足够的能力重建原始文件。

但是这些似乎不太适合您的场景。

于 2010-11-28T03:32:34.463 回答
2

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

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

于 2010-11-28T03:50:51.393 回答
2

考虑查看覆盖网络,或者简单地使用提供发布语义的消息中间件,例如ØMQ,它也方便地提供 BSD 套接字 API。

于 2010-11-28T04:34:56.677 回答