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

本文介绍了如何利用UDP组播在局域网中实现设备发现和软件更新,避免固定服务器IP的问题。通过对比广播和组播的优缺点,选择了组播技术,因为它能有效地减少带宽占用并只将数据发送给需要的接收者。在Qt环境中,展示了如何设置发送和接收组播的代码示例,通过定时发送和接收数据来找到并通信。文章还详细说明了组播地址的范围,并提供了实际操作的步骤和注意事项。
摘要由CSDN通过智能技术生成

使用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组播的使命到这里就结束了,剩下的就交给其他人吧,不能逮着一个人霍霍啊,还是要雨露均沾的。

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用jmdns发现局域网设备,在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的ip地址,但是有些时候,你并不知道对方的ip地址,因为一般使用DHCP动态分配ip地址的局域网内,各个主机的IP地址是由DHCP服务器来帮你分配IP地址的。所以在很多情况下,你要知道对方的IP地址是比较麻烦的。 鉴于发现这篇文章最近的浏览量比较多,晚上也有不少转载,特别声明一下,文章水平可能不大够,只是我当时的一些理解,所以希望大家以批判的角度来看,然后又什么问题欢迎讨论。真心不希望误导大家^_^ mDNS就是来解决这个问题的。通过一个约定俗成的端口号,5353。(这个端口号应该是由IETF组织约定的。)每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。 比如,A主机进入局域网,开启了mDNS服务,并向mDNS服务注册一下信息:我提供FTP服务,我的IP是192.168.1.101,端口是21。当B主机进入局域网,并向B主机的mDNS服务请求,我要找局域网内FTP服务器,B主机的mDNS就会去局域网内向其他的mDNS询问,并且最终告诉你,有一个IP地址为192.168.1.101,端口号是21的主机,也就是A主机提供FTP服务,所以B主机就知道了A主机的IP地址和端口号了。 大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。 在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。 这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值