局域网设备查找和发现,局域网软件在线更新,Qt udp组播

2023-11-02

使用udp组播原因:

        想要实现查找局域网自己的设备,但是不知道存在设备的ip;

        局域网软件在线更新,不想固定服务器的ip地址,因为是开发人员电脑,ip可能随时在变化;

        比较了广播、组播的优缺点,最终选择组播;

组播优点:

        组播技术的初衷是在IP网络中,以"尽力而为"的形式发送信息到某个目标组,这个目标组称为组播组,这样在有源主机向多点目标主机发送信息需求时,源主机只发送一份数据,数据的目的地址是组播组地址,这样,凡是属于该组的成员,都可以接收到一份源主机发送的数据的拷贝,此组播方式下,只有真正信息需要的成员会收到信息,其他主机不会收到。组播方式解决了单播情况下数据的重复拷贝及带宽的重复占用,也解决了广播方式下带宽资源的浪费。

组播地址:(所以我们使用239.0.0.0~239.255.255.255最合适)

        组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。

        224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;

        224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;

        224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;

        239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

实际qt代码:

注意:同一个程序里面,发送组播ip和接收组播ip分开,也就是一个用来接收别人的消息,一个用来发送消息给别人;端口号也分别使用两个;

使用前需要做的:

//包含头文件之前请在项目pro文件中添加
QT += network

//在要使用的地方添加头文件
#include <QUdpSocket>
#include <QHostInfo>
#include <QNetworkInterface>

1、初始化

void ****** ::Start()
{
    //创建组播发送
    QUdpSocket c_SenderUdpSocket4.bind(QHostAddress(QHostAddress::AnyIPv4), 0);
    c_SenderUdpSocket4.setSocketOption(QAbstractSocket::MulticastTtlOption, 10);//10表示发送的消息可以被转发10次

    //创建组播接收
    QUdpSocket c_ReceiverUdpSocket4.bind(QHostAddress::AnyIPv4, 23901, QUdpSocket::ShareAddress);
    c_ReceiverUdpSocket4.joinMulticastGroup(QHostAddress(239.239.239.230));
    connect(&c_ReceiverUdpSocket4, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));//绑定接收响应函数

    //获取本机第一个ipv4的ip地址(这个地址一般来说就是本机ip地址)
    auto HostAddressList = QNetworkInterface::allAddresses();
    for (auto i = HostAddressList.begin(); i != HostAddressList.end(); i++) {
        if (i->protocol() == QAbstractSocket::IPv4Protocol)
        {
            c_LocalAddress = (*i).toString();
            break;
        }
    }

    //设置定时器,定时发送组播数据
    c_timer = new QTimer(this);
    connect(c_timer, SIGNAL(timeout()), this, SLOT(TimerOut()));
    c_timer->start(500);
}

2、超时响应函数

void ******::TimerOut()
{
//就是定时发送组播信息
	QString datagram("Is anyone there?Give me your IP.My IP is 192.168.1.111");
    c_SenderUdpSocket4.writeDatagram(datagram.toStdString().c_str(),datagram.size(), QHostAddress("239.239.239.231"), 23910);
}

3、接收响应函数

void ******::processPendingDatagrams()
{
    QByteArray datagram;
    // using QUdpSocket::readDatagram (API since Qt 4)
    while (c_ReceiverUdpSocket4.hasPendingDatagrams()) {
        datagram.resize(int(c_ReceiverUdpSocket4.pendingDatagramSize()));
        c_ReceiverUdpSocket4.readDatagram(datagram.data(), datagram.size());
        //      Received IPv4 datagram
        emit ReceiveUdpGroupData(datagram.constData());
    }
    QString Data(datagram.constData());
    /*
    这里处理接收到的数据
    如果一个组很多人同时发送数据过来,记得自己拆分
    */

    //一般接收到数据后是自己需要的就停止定时发送数据,基本这里就获取到我们想要的数据了;
    //比如你收到的“192.168.1.111,i'm waiting for you,My IP is 192.168.2.222”
    c_timer->stop();

    // using QUdpSocket::receiveDatagram (API since Qt 5.8)
//    while (udpSocket6.hasPendingDatagrams()) {
//        QNetworkDatagram dgram = udpSocket6.receiveDatagram();
//        statusLabel->setText(statusLabel->text() +
//                             tr("\nReceived IPv6 datagram from [%2]:%3: \"%1\"")
//                             .arg(dgram.data().constData(), dgram.senderAddress().toString())
//                             .arg(dgram.senderPort()));
//    }
}

最后:

        这样一操作,哈哈你是不是就知道对方ip了,对方也知道你的ip了,剩下的就自由发挥了,基本上udp组播的使命到这里就结束了,剩下的就交给其他人吧,不能逮着一个人霍霍啊,还是要雨露均沾的。

如有不正确或者不足之处还望各位指正!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

局域网设备查找和发现,局域网软件在线更新,Qt udp组播 的相关文章

随机推荐

  • unity2019中虚拟按钮的使用

    版本 unity2019 4 12f1 Visual Studio2019 1 window栏加入Vuforia Engine AR 此时可以正常使用AR相机了 2 利用vuforia码 建立一个空物体showcube 然后在空物体上加入V
  • Pywin32:Python库的简介、安装和使用攻略

    Pywin32 Python库的简介 安装和使用攻略 Pywin32是Python的一个强大而广泛使用的库 它提供了访问Windows API的接口 以实现处理Windows系统资源的功能 如窗口管理 注册表操作 消息传递等等 这里我们将为
  • 遗传算法解决TSP问题

    一 背景 遗传算法是基于自然选择和自然遗传机制的一种随机搜索算法 具有良好的并行性和全局寻优能力 能够自适应地调整搜索方向 这是一种相对来说比较简单的算法 因为它不需要问题求解者具备非常完备的问题领域知识 它能够通过类似生物体繁殖后代的机制
  • FreeRTOS学习笔记—任务创建和删除

    文章目录 一 任务创建和删除API函数 1 1 xTaskCreate 函数 1 2 xTaskCreateStatic 函数 1 3 vTaskDelete 函数 二 任务创建和删除 动态方法 2 1 任务要求 2 2 程序设计 2 2
  • 关于Collection下的removeAll方法抛出UnsupportedOperationException分析

    起因 这周在开发的过程遇到了以下这个错误 之前一直规范运用Collection的接口 所以这个异常比较少见 所以我就纳闷了 做个一个实验 package src import com google common collect Sets i
  • 《小家:越住越大2》

    第一章 餐厅如何避免杂乱 一般家庭的餐桌物品占用餐桌桌面面积普遍较高 显得餐桌杂乱 可以采用餐边柜与餐桌零距离接触方式方便杂物摆放 也可以采用移动是多层收纳车 如何避免孤单在厨房做饭 厨房与餐厅采用玻璃吊轨门连接 可以使用卡座代替普通餐椅
  • 12,verilog移位操作

    注 学习 交流就在博主的个人weixin公众号 FPGA动力联盟 留言或直接 博主weixin fpga start 私信 Verilog中的移位操作有两类 逻辑移位和算术移位 逻辑右移 gt gt 1个操作数向右移位 产生的空位用0填充
  • 毕业设计-基于深度学习的病理图像细胞核分割

    目录 前言 课题背景和意义 实现技术思路 一 相关技术介绍 二 基于双通路解码的病理图像细胞核分割 三 基于无锚检测的病理图像细胞核分割 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学
  • 函数递归

    函数递归 1 递归是什么 2 递归的限制条件 3 递归举例 4 递归与迭代 1 递归是什么 递归是指函数可以调用自身来解决问题的一种编程技巧 在C语言中 递归是通过函数调用自己来实现的 使用递归可以使某些问题更容易理解和处理 例如 计算一个
  • nginx服务器access_log日志详解

    前言 nginx的log日志分为 access log 和 error log 其中access log 记录了哪些用户 哪些页面以及用户浏览器 ip和其他的访问信息 error log 则是记录服务器错误日志 log format 日志格
  • 服务器上部署前端Vue项目代码

    服务器上部署前端Vue项目代码 本人自己感觉部署前端代码比部署后端难 主要是我在部署的过程中遇到了各种报错 写这篇文章主要是记录一下自己艰难的踩坑过程 最终部署成功 前端框架使用的是Vue3 服务器系统是CentOS7 部署的整个过程主要分
  • SpringBoot各个版本使用Redis之间的区别

    今天在springboot中使用数据库 springboot版本为2 0 2 RELEASE 通过pom引入jar包 配置文件application properties中的redis配置文件报错 提示例如deprecated config
  • 阿里云 MongoDB 的连接使用规范

    阿里云 MongoDB 的连接使用规范 概述 我们在阿里云上的 MongoDB 有两种 副本集 主 被两个节点 分片集 集群 在多个业务同时连接 MongoDB 使用时 最重要的连接数问题 一旦超过最大值即影响其它业务的使用 所以必须要规范
  • Mysql 开源数据源笔记

    DBCP C3P0数据源 tomcat内置的数据源DBCP DBCP 方式1 BasicDataSource source new BasicDataSource source setDriverClassName com mysql jd
  • allegro 遇到的问题汇总 避免忘记

    目录 目录 1 已经布板后如何更新封装 2 如何批量放置VIA 3 如何替换某个过孔 4 OrCAD跟Allegro交互设置 5 在制作封装时 如何修改封装引脚的PIN Number 6 ORCAD画原理图时 off page connec
  • Linux关机命令详解

    在linux下一些常用的关机 重启命令有shutdown halt reboot 及init 它们都可以达到重启系统的目的 但每个命令的内部工作过程是不同的 Linux centos重启命令 1 reboot 2 shutdown r no
  • 表格与表单的嵌套关系

    表格与表单的嵌套关系 想要用表格与表单做一个注册界面 却对这两个元素的嵌套关系挡住的脚步 到底是表格里面放置表单呢 还是表单里面放置表格呢 没关系 小马哥带你答疑解惑 1 首先我们可以创建一个空表单 在这个表单里面不用放任何东西 2 然后我
  • selenium自动化环境搭建(Windows)

    一 selenium介绍 selenium主要用于web应用程序的自动化测试 还支持所有基于web的管理任务自动化 selenium经历了2个版本 selenium1 0和selenium2 0 selenium不是一个单独的工具 而是由一
  • 如何对Docker容器进行健康检查

    如何对 Docker 容器进行健康检查 熟悉使用过kubernetes的人应该知道 kubernetes支持对pod进行健康检查的功能 这对生产业务来说其实是非常有用处的 能快速发现服务不可用 并进行快速重启恢复 其实不使用kubernet
  • 局域网设备查找和发现,局域网软件在线更新,Qt udp组播

    使用udp组播原因 想要实现查找局域网自己的设备 但是不知道存在设备的ip 局域网软件在线更新 不想固定服务器的ip地址 因为是开发人员电脑 ip可能随时在变化 比较了广播 组播的优缺点 最终选择组播 组播优点 组播技术的初衷是在IP网络中