可以通过TCP进行广播吗?
我正在用C编写服务器/客户端系统,它在TCP连接下使用BSD套接字。 服务器是multithreading的,每个连接都在自己的接收器中运行。 每个客户端都能很好地与服务器进行一对一的交谈,遗憾的是我无法想到实现SendToAll()函数的方法,例如,如果客户端A做了需要发送数据包的事情。所有的客户。 我该怎么办?
我正在考虑在每个接收器中实现队列,并且任何广播都被发送到这些队列; 当接收器发出一个新数据包时,它会将该消息添加到数据包中,如果这有意义的话。
但是,有没有办法通过TCP广播,就像你可以通过UDP?
正如每个人都说TCP不可能,它只是单播。 然而,存在可靠多播的实现,这应该为您提供具有TCP可靠性的多播。 请参阅维基百科 ,尤其是Pragmatic General Multicast 。
不,没有。 例如,如果您尝试与多方交谈,窗口大小的概念及其调整方式将变得毫无意义。
有可能创建一个新协议,该协议在允许多播的同时共享TCP的许多属性。 但我认为这将是非常有问题的。 例如,接收者接收数据的速度将受到最慢接收器的限制。 发送方必须管理缓冲区空间,以便即使是最慢的接收方也可以在必要时进行重新传输。
不,我认为进行多播的协议总是必须是非常特殊的目的,并专注于手头的确切问题。 一般化和类似TCP的东西是不可行的。
有多种方法可以进行可靠的多播批量数据传输。 基本思想是使用纠删码以一种循环方式连续传输信息。 然后,收件人可以开始接收数据包,直到他们有足够的重建原始文件。
但这些似乎并不适合您的情况。
考虑查看覆盖网络 ,或者仅使用提供发布语义的消息传递中间件,例如ØMQ ,它也可以方便地提供BSD套接字API。
您的SendToAll()
需要遍历所有打开的套接字并独立地将数据写入每个套接字。
广播和多播仅限于UDP套接字。