可以通过TCP进行广播吗?

时间:2010-11-28 03:27:35

标签: c networking tcp broadcast sockets

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

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

但是,有没有办法通过TCP广播,就像你可以通过UDP一样?

4 个答案:

答案 0 :(得分:11)

正如大家所说,TCP不可能,但它只是单播。但是,存在可靠多播的实现,这应该为您提供具有TCP可靠性的多播。请参阅wikipedia,尤其是Pragmatic General Multicast

答案 1 :(得分:8)

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

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

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

有多种方法可以进行可靠的多播批量数据传输。基本思想是使用erasure codes以一种循环不断传输信息。然后,收件人可以开始接收数据包,直到他们有足够的数据重建原始文件。

但这些似乎并不适合你的情况。

答案 2 :(得分:2)

考虑查看overlay networks,或者只是使用提供发布语义的消息传递中间件,例如ØMQ,它也可以方便地提供BSD套接字API。

答案 3 :(得分:1)

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

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