QT UDP组播与广播

5 篇文章 1 订阅

首先明确一点,只有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");
    }
}

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值