QT5 “Multicast Receiver Example”组播接收数据的说明

10 篇文章 0 订阅
4 篇文章 0 订阅

本文基于的QT版本为5.13.0。在更早支持组播的QT版本中,应该也是适用的。

在QT提供的“Multicast Receiver Example”示例程序中,udpSocket4这个QUdpSocket对象,是使用下面的方式,进行绑定和加入组播的:

    udpSocket4.bind(QHostAddress::AnyIPv4, 45454, QUdpSocket::ShareAddress);
    udpSocket4.joinMulticastGroup(groupAddress4);

通常情况下,这是没有问题的。

这里的“通常”,在于以下的场景:本地只有一个网络接口;或者只有一个ipv4;或者不介意绑定端口上收到的数据既有发送到组播(groupAddress4)地址的,也有可能是直接发给本地的ipv4地址的;或者发送方/接收方的端口丰富可协商,对每类业务,都能分配不同的地址/端口,等等。

然而,若是确实有脱离“通常”情况的需求时,你仍然需要对windows、linux的bind操作,进行分别的处理,在“linux下UDP组播接收不到数据的说明”一文中,对基于libuv、原生编程的两种情况的方案进行了说明,保持尽量的完整性,再补充一下关于QT的实际方案:

#if defined(_WIN32)
    udpSocket4.bind(QHostAddress("指定的本地ipv4地址,非0.0.0.0"), 45454, QUdpSocket::ShareAddress);
    udpSocket4.joinMulticastGroup(groupAddress4);
#else // 简略假设只有linux:__linux__
    // 下面是linux的不同点
    udpSocket4.bind(groupAddress4, 45454, QUdpSocket::ShareAddress);
    udpSocket4.joinMulticastGroup(groupAddress4);
#endif

 

其他

从unix网络编程中,可以较明确的获取到,在linux中,为何要这样绑定的原因说明。相反的,windows里的实现考虑,我们就不得而知了。然而,相比较而言,windows的使用方式,私以为是更为舒适的(尽管会造成同端口上,单播和组播的混乱)。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中的UDP(User Datagram Protocol)提供了一种无连接的数据报网络通信方式,适用于对实时性要求较高的应用场景,比如视频流和组播通信。在Qt中,你可以使用QAbstractSocket子类QUdpSocket来创建一个UDP套接字,并进行组播数据的发送。 以下是使用Qt UDP组播地址发送数据的基本步骤: 1. **创建QUdpSocket实例**: ```cpp QUdpSocket *socket = new QUdpSocket(this); ``` 2. **设置组播地址和端口**: ```cpp quint32 multicastAddress = INADDR_ANY; // 接收所有接口的组播 quint16 multicastPort = 1900; // 组播端口,例如用于发现服务的IGMPv2 M-SEARCH if (!socket->bind(QHostAddress::Any, multicastPort)) { qDebug() << "Failed to bind to port " << multicastPort; } ``` 3. **加入组播组**: ```cpp if (!socket->joinMulticastGroup(QHostAddress(Q_IPV4_MULTICAST_LOOPBACK), multicastAddress)) { qDebug() << "Failed to join multicast group"; } ``` 4. **准备数据**: ```cpp QByteArray dataToSend = "Your data here"; // 您想要发送的数据 ``` 5. **发送数据**: ```cpp qint64 bytesSent = socket->writeDatagram(dataToSend, multicastAddress, multicastPort); if (bytesSent > 0) { qDebug() << "Sent " << bytesSent << " bytes to multicast"; } else { qDebug() << "Failed to send data"; } ``` 6. **处理接收**: 对于接收,由于组播通常不保证单向通信,你需要另外设置一个监听器来接收来自其他组播成员的数据。 **相关问题--:** 1. QUdpSocket的用途是什么? 2. 如何处理UDP套接字的错误? 3. 组播通信中的M-SEARCH是什么?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值