首先明确一点,只有UDP才有点对点、组播、广播的概念,TCP只有点对点。
一、组播编程步骤
1、接收方
(1) new一个UDP socket对象
(2)把socket bind到指定的IP: 端口号,因为本机会有多个IP,我们选择到底把哪个IP加入组播,如果想把本机所有的IP都加入组播,可bind这个IP:QHostAddress::AnyIPv4。
(3)加入到组播IP,函数为 joinMulticastGroup
(4)可随时退出该组播IP,函数为leaveMulticastGroup
2、发送方
与点对点的UDP编程步骤完全相同,不同之处只有一点:目标IP改成组播地址,端口号还是保持点对点的端口号。
3、效果
当发送方,向组播IP:PORT发送数据时,所有加入该组播IP的socket,都会收到这波数据,并且数据中仍然会携带发送方的IP:PORT。
当发送方,点对点发送、或者广播发送数据时,接收方情形不变。也即,接收方只会收到数据以及发送者的IP:PORT,但是并不知道这波数据是到底通过【点对点/组播/广播】哪一种接来的。
如果socket没有bind任何IP,或者bind失败,此时执行加入组joinMulticastGroup或者退出组leaveMulticastGroup,都会返回错误。
组播的效果,类似于这种情形:每一个socket都是一个人,每个人可以选择是否加入某个群,如果加了群,当某个人向群里发消息时,那么群里的每个人都会看到消息,并且也能知道是谁发的消息。同时每个人也可以私密地一对一发消息。
二、广播
发送方和接收方的编程步骤,与点对点完全相同。唯一区别在于,发送方的目标IP填:QHostAddress::Broadcast 或者 xxx.xxx.xxx.255。
QHostAddress::Broadcast 是向本机所在的所有IP网段广播,xxx.xxx.xxx.255是只向本机xxx.xxx.xxx.0~254网段广播。
点对点的UDP编程可参考我的另一篇博文《UDP编程模板》
点击界面中的【按下时加入组播】按钮时,槽函数为:
void MainWindow::on_pbt_toggleGroup_clicked(bool checked)
{
bool ok;
QHostAddress groupIp(QHostAddress(ui->lineEdit_groupIp->text()));
// uint16_t groupPort = ui->spinBox_groupPort->value();
if(checked)
{
// udpSocket->close();
// ok = udpSocket->bind(QHostAddress::AnyIPv4, groupPort);//绑定本机所有ip来接收组播组信息;
// 也可以在点击【开启UDP】按钮时,绑定任意一个IP:PORT,此时这里就无需再bind了
// if(ok)
// debug_print("组播bind ok");
// else
// debug_print("组播bind failed");
ok = udpSocket->joinMulticastGroup(groupIp);//加入组播组ip:224.0.0.1
if(ok)
debug_print("加入组播 ok");
else
debug_print("加入组播 failed");
}
else
{
ok = udpSocket->leaveMulticastGroup(groupIp);
if(ok)
debug_print("退出组播 ok");
else
debug_print("退出组播 failed");
}
}