当发送者需要通过以太网以可靠的方式将相对大量的数据(比如几兆字节每秒)多播到同一子网上的适量接收器(比如少于十几个)时,最有效的协议是什么?通过可靠,我的意思是,如果数据包丢失,协议确保重新发送,以便任何接收器都不会丢失数据." 高效"这个术语要定义起来要困难得多,但是假设我们希望通过两端适度的CPU使用来最大化吞吐量并最小化网络带宽.这仍然不是一个明确的定义,但它是我能想到的最好的.面向流或面向消息的协议都是可以接受的.
我很欣赏现实世界的例子,我很乐意接受主观的答案,即你最喜欢的多播协议是什么,如果你能解释它的优点和缺点.
ethernet protocols multicast file-transfer reliable-multicast
这个问题类似于/sf/ask/815522991/,但我的代码与它略有不同,因此可能会导致在一个不同的答案.
我试图获得可靠的多播服务器/客户端概念验证设置.
解决方案本身是服务器/客户端连接.客户端通过TCP/IP连接到服务器.然后,服务器打开一个可靠的多播套接字供客户端监听.客户端通过TCP发送消息,服务器通过TCP回送消息IPPROTO_RM.最终目标是让许多客户端连接到服务器,所有客户端都接收每个回显的消息.
示例代码基于此页面.
我已经设置了类似的RM套接字(参见下面的清单).TCP套接字工作正常.问题在于RM套接字.服务器开启了组播插座,然后binds和connects多播地址正确.然而,客户端是listens正确的,但accept永远是对块的调用.
客户端和服务器进程都在同一主机上运行.
我已经检查过,主机上安装了多播支持(Server 2008).
更新:我注意到,如果我先从发送方侧向套接字发送一些数据,有时接受将返回.这不是理想的,也不可靠.
更新:标志指向开关.看起来像一个小集线器不会削减它.我们发生了一个搞笑的事件,导致整栋大楼失去了通讯.
short
Port = 0;
const char
*Address = "234.5.6.7";
SOCKET
RMSocket;
SOCKADDR_IN
LocalAddr,
SessionAddr;
RMSocket = socket(AF_INET, SOCK_RDM, IPPROTO_RM);
if (RMSocket == INVALID_SOCKET)
{
return Failed;
}
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_port = htons(0);
LocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if ( bind( RMSocket, (SOCKADDR*)&LocalAddr, sizeof(LocalAddr)) == SOCKET_ERROR )
{
return Failed;
}
SessionAddr.sin_family …Run Code Online (Sandbox Code Playgroud) 我正在为我的大学考试做准备,去年的一个问题是"如何使UDP组播可靠"(如tcp,重传丢失的数据包)
我想过这样的事情:
服务器使用UDP发送多播
每个客户端发送接收该数据包的确认(使用TCP)
如果服务器意识到不是每个人都收到数据包,它会将多播或单播重新发送到特定客户端
问题是可能有一个客户端通常丢失数据包并强制服务器重新发送.
好吗 ?
我正在使用 C++ 和 Qt 实现一个消息系统。经过深思熟虑,我确定多播或多播风格的技术最能解决我的问题。然而,我了解到UDP的不可靠性并认为这是不可接受的。
我的要求如下:
我听说过 OpenPGM 和 NORM 作为 UDP 的替代品。如果有人有这方面的经验,可以分享一下吗?
我也对自己在应用层实现“可靠”多播的可能性持开放态度,但如果有一个库已经实现了这一点,我不希望这样做。
我使用的是 C++ 和 Qt,因此基于 .NET 或 Java 的解决方案是不可接受的,除非它们是开源的并且我可以将它们移植到 C++。
非常感谢。
编辑 20120816T1853 MDT:另一个问题:是否必须在硬件/IP 级别实现 PGM 或 NORM?或者它们可以叠加在现有协议之上吗?