当前位置: 首页 > news >正文

QT Udp广播实现设备发现

测试环境

本文选用pc1作为客户端,pc2,以及一台虚拟机作为服务端

  • pc1,pc2(客户端):
    在这里插入图片描述
  • 虚拟机(服务端):
    在这里插入图片描述

客户端

  • 原理:客户端通过发送广播消息信息到ip:255.255.255.255(QHostAddress::Broadcast),局域网内的所有设备收到该消息回复客户端即可。客户端通过收到的回复统计当前有哪些设备在线
  • 获取到本地的IP,getLocalIP函数获取到过滤了虚拟机网卡以及本地回环网卡后的ip地址。
    在这里插入图片描述
#include "udpclient.h"
#include <QDebug>
#include <QHostInfo>
#include <QNetworkInterface>
#include <iostream>udpClient::udpClient(QObject *parent) : QObject(parent)
{QString localIp = getLocalIP();udpSocket = new QUdpSocket;udpSocket->bind(QHostAddress(localIp),2001);connect(udpSocket,&QUdpSocket::readyRead,this,&udpClient::processData);}QString udpClient::getLocalIP() {QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();foreach (const QNetworkInterface &interface, interfaces) {QList<QNetworkAddressEntry> entries = interface.addressEntries();qDebug()<<"name:"<<interface.humanReadableName()<<endl;if(interface.humanReadableName().contains("Loopback") ||interface.humanReadableName().contains("VMware Network Adapter")){continue;}foreach (const QNetworkAddressEntry &entry, entries) {if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol) {qDebug() << "Local IP Address: " << entry.ip().toString()<< endl;}}}return QString();
}udpClient::~udpClient()
{if(udpSocket){delete udpSocket;}
}void udpClient::sendBroadCast()
{QByteArray datagram = "Device Discovery";udpSocket->writeDatagram(datagram,QHostAddress::Broadcast,8888);
}void udpClient::processData()
{while(udpSocket->hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);qDebug() << "Received response from: " << sender.toString()<<"port:"<<senderPort << endl;}
}

服务端

#include "udpserver.h"
#include <iostream>udpServer::udpServer(QObject *parent) : QObject(parent)
{udpSocket = new QUdpSocket(this);udpSocket->bind(QHostAddress::Any, 8888);connect(udpSocket, &QUdpSocket::readyRead, this, &udpServer::processPendingDatagrams);}void udpServer::processPendingDatagrams()
{while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());QHostAddress sender;quint16 senderPort;udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);std::cout << "Received discovery message: " << datagram.data() << std::endl;QByteArray response = "Device Found";udpSocket->writeDatagram(response, sender, senderPort);}
}

输出效果

在这里插入图片描述
在这里插入图片描述

相关文章:

  • Camtasia Studio怎么自动加字幕呢,Camtasia Studio有什么功能呢
  • 中介子方程七
  • 【西瓜书】4.决策树
  • 开发指南028-生成二维码
  • python : map list 切片 推导式
  • 【讲解下ECMAScript和JavaScript之间有何区别?】
  • 力扣 41.缺少的第一个正整数
  • 解决 There is no getter for property named ‘null‘ in ‘class 报错
  • HTML静态网页成品作业(HTML+CSS)—— 家乡南宁介绍网页(2个页面)
  • NSS题目练习7
  • 分享一个 .NET Core Console 项目使用依赖注入的详细例子
  • 前后端实现文件上传进度条-实时进度
  • linux防止nmap扫描
  • Elasticsearch之写入原理以及调优
  • 数据结构--二叉树(二)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • angular组件开发
  • httpie使用详解
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java多线程(4):使用线程池执行定时任务
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • 番外篇1:在Windows环境下安装JDK
  • - 概述 - 《设计模式(极简c++版)》
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • ​​​​​​​​​​​​​​Γ函数
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​学习一下,什么是预包装食品?​
  • ######## golang各章节终篇索引 ########
  • #《AI中文版》V3 第 1 章 概述
  • #include到底该写在哪
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $GOPATH/go.mod exists but should not goland
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (接口自动化)Python3操作MySQL数据库
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (三)c52学习之旅-点亮LED灯
  • (三)mysql_MYSQL(三)
  • (五)网络优化与超参数选择--九五小庞
  • (一)Linux+Windows下安装ffmpeg
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)linux 命令大全
  • .Mobi域名介绍
  • .NET C# 使用GDAL读取FileGDB要素类
  • .Net CoreRabbitMQ消息存储可靠机制