ZBLOG

void DeviceBroadcaster::processBroadcast() { while (mUdpSock.hasPendingDatagrams()) { QByteArray data; qint64 datagramSize = mUdpSock.pendingDatagramSize(); assert(datagramSize

这段代码是一个处理UDP广播消息的函数 DeviceBroadcaster::processBroadcast()。它使用Qt框架中的QUdpSocket来接收和处理传入的UDP数据报。下面是对代码的逐行解释:

代码分析

  1. 循环检查待处理的数据报

    while (mUdpSock.hasPendingDatagrams()) {
    

    使用 hasPendingDatagrams() 检查是否有待处理的数据报,如果有,就进入循环。

  2. 定义变量: “`cpp QByteArray data;

qint64 datagramSize = mUdpSock.pendingDatagramSize(); assert(datagramSize <= std::numeric_limits::max());

   定义一个字节数组 `data` 用于存储接收到的数据,并获取下一个待处理数据报的大小。如果大小超过 `int` 的最大值,程序会触发断言。

3. **调整字节数组大小并读取数据**:
   ```cpp
   data.resize(static_cast<int>(datagramSize));
   QHostAddress sender;
   
   mUdpSock.readDatagram(data.data(), data.size(), &sender);

调整 data 的大小以适应接收到的数据,然后使用 readDatagram() 函数从套接字中读取数据,并将发送者的地址存储在 sender 中。

  1. 解析JSON对象

    QJsonObject obj = QJsonDocument::fromJson(data).object();
    if (obj.keys().length() == 4) {
       ...
    }
    

    将接收到的字节数据解析为JSON对象,并检查该对象是否包含四个键值对(表明数据格式是预期的)。

  2. 验证端口号

    if (obj.value("port").toVariant().value<quint16>() ==
            Settings::instance()->getBroadcastPort()) {
    

    检查JSON对象中名为 "port" 的值是否等于当前设置中的广播端口。如果匹配,则继续执行。

  3. 创建Device对象

    Device device{obj.value("id").toString(), obj.value("name").toString(),
                  obj.value("os").toString(), sender};
    

    创建一个名为 device 的新设备对象,构造函数接受设备ID、名称、操作系统和发送者IP地址作为参数。

  4. IP地址匹配逻辑

    QString ipString = sender.toString();
    if (ipString.startsWith("::ffff:")) {
        ipString = ipString.mid(7);  // 去掉前7个字符
    }
    if(ipString == m_ServerIp || m_ServerIp == "") {
         emit broadcastReceived(device);
    }
    
    • 获取发送者的IP地址字符串。
    • 如果IP地址是IPv6映射到IPv4(以”::ffff:“开头),则去掉这个前缀。
    • 检查这个IP地址是否与类成员变量 m_ServerIp 匹配,如果匹配或者 m_ServerIp 是空字符串,则发出信号通知有新的广播消息被接收 (emit broadcastReceived(device)).

总结

整个函数用于监听并处理通过UDP广播接收到的信息。它解析这些信息,如果符合特定条件(如匹配端口和IP),就会将新的设备信息通过信号传递出去。这种模式常用于网络发现协议,在本地网络上寻找特定类型的设备。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6062

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?