1. 组播的介绍
主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。
2. 组播的优点
-
需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。
-
由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个(268435456)组播,所以其提供的服务可以非常丰富。
-
此协议和单播协议一样允许在Internet宽带网上传输。
3. 两台主机完成UDP组播通信
具体步骤
-
选定一个组播IP地址和端口号,例如组播IP地址为224.0.0.1,端口号为8000。
-
在发送端,创建一个QUdpSocket对象,并绑定到本地IP地址和端口号。
-
使用
QUdpSocket::joinMulticastGroup()
函数将QUdpSocket对象加入到组播组。 -
使用
QUdpSocket::writeDatagram()
函数发送数据报。 -
在接收端,创建一个QUdpSocket对象,并绑定到组播IP地址和端口号。
-
使用
QUdpSocket::joinMulticastGroup()
函数将QUdpSocket对象加入到组播组。 -
使用
QUdpSocket::readyRead()
信号和QUdpSocket::readDatagram()
函数接收数据报。
具体实现可以参考以下代码示例:
发送端:
// 创建QUdpSocket对象
QUdpSocket socket;
// 绑定到本地IP地址和端口号
socket.bind(QHostAddress::Any, 8000);
// 将socket加入到组播组
socket.joinMulticastGroup(QHostAddress("224.0.0.1"));
// 发送数据报
QByteArray data = "hello world";
socket.writeDatagram(data, QHostAddress("224.0.0.1"), 8000);
接收端:
// 创建QUdpSocket对象
QUdpSocket socket;
// 绑定到组播IP地址和端口号
socket.bind(QHostAddress("224.0.0.1"), 8000);
// 将socket加入到组播组
socket.joinMulticastGroup(QHostAddress("224.0.0.1"));
// 接收数据报
connect(&socket, &QUdpSocket::readyRead, [=]() {
while (socket.hasPendingDatagrams()) {
QByteArray data;
QHostAddress sender;
quint16 port;
socket.readDatagram(data.data(), data.size(), &sender, &port);
qDebug() << "received data: " << data;
}
});
在这个示例中,发送端和接收端都加入了组播组,这样就可以在组播IP地址和端口号上进行通信。当发送端发送数据报时,接收端会接收到数据报并打印出来。