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

【mDNS协议】通过UDP广播在局域网内实现设备自动发现和连接的协议

参考链接:https://blog.51cto.com/u_4080467/1387539

简介

mDNS(Multicast DNS)是一种用于设备发现的协议。

mDNS是一种通过UDP广播在局域网内实现设备自动发现和连接的协议,广泛应用于打印机发现、IoT设备连接、文件共享和软件服务扩展等场景。

这种协议允许设备在局域网中通过UDP广播方式进行通信,以便发现其他设备并获取其网络配置信息。

工作机制
  1. 每个设备在启动时会在局域网中广播自己的mDNS服务信息,包括设备名称、IP地址等。
  2. 其他设备接收到广播消息后,可以解析其中的信息,并根据需要与广播设备进行通信。
  3. 设备可以定时重发mDNS广播消息,以保持设备间的连接状态。
应用场景
  1. 打印机自动发现:通过mDNS协议,打印机可以广播自己的服务信息,使得用户可以方便地在网络中找到并连接打印机,而无需手动配置IP地址。
  2. IoT设备自动发现:智能家居设备、传感器等可以通过mDNS协议进行自动发现和连接,实现设备无缝联接。
  3. 文件共享:mDNS协议可以用于发现局域网中共享文件夹的设备,使得用户可以轻松地共享文件,并进行文件传输和共享。
  4. 插件和服务发现:在一些软件中,mDNS协议可以用于插件和服务的自动发现,实现软件的功能扩展和协作。

总之,mDNS协议是一种用于设备发现的协议,可以在局域网中方便地发现和连接其他设备,使得设备间的通信和协作更加简单和高效

典例(某中厂面试题)

利用mdns协议用c/c++实现一套服务发现机制(含客户端和服务端)

如将mqtt服务器地址mqtts://tb.com 通过协议发送给客户端。

#include <avahi-client/client.h>
#include <avahi-client/publish.h>
#include <avahi-common/thread-watch.h>
#include <string>int main() 
{// 初始化Avahi客户端AvahiClient *client = avahi_client_new(avahi_threaded_poll_get(NULL), AVAHI_CLIENT_NO_FAIL, NULL, NULL, NULL);// 创建服务AvahiEntryGroup *group = avahi_entry_group_new(client, NULL, NULL);// 添加服务信息,这里假设广播的服务名为 "MQTTServer",类型为 "_mqtt._tcp"std::string mqttServerAddress = "mqtts://tb.com";avahi_entry_group_add_service(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_NO_PROBE, "MQTTServer", "_mqtt._tcp", NULL, NULL, 0, NULL);// 添加TXT记录,包含MQTT服务器地址信息AvahiStringList *txt = avahi_string_list_add_pair(NULL, "mqtt_server_address", mqttServerAddress.c_str());avahi_entry_group_add_service_strlst(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_NO_PROBE, "MQTTServer", "_mqtt._tcp", NULL, NULL, 0, txt);// 提交服务avahi_entry_group_commit(group); // 运行事件循环AvahiThreadedPoll *poll = const_cast<AvahiThreadedPoll*>(avahi_threaded_poll_get(NULL));avahi_threaded_poll_start(poll);return 0;
}
/*cilent*/
#include <avahi-client/client.h>
#include <avahi-client/lookup.h>
#include <avahi-common/thread-watch.h>
#include <string>
#include <iostream>void browse_callback(AvahiServiceBrowser *browser, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event,const char *name, const char *type, const char *domain, AvahiLookupResultFlags flags, void *userdata) 
{if (event == AVAHI_BROWSER_NEW) {std::cout << "Service discovered: " << name << std::endl;}
}int main() 
{// 初始化Avahi客户端AvahiClient *client = avahi_client_new(avahi_threaded_poll_get(NULL), AVAHI_CLIENT_NO_FAIL, NULL, NULL, NULL);// 创建服务浏览器AvahiServiceBrowser *browser = avahi_service_browser_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_mqtt._tcp", NULL, AVAHI_LOOKUP_NO_ADDRESS, browse_callback, NULL);// 开始浏览服务avahi_service_browser_start(browser);// 运行事件循环AvahiThreadedPoll *poll = avahi_threaded_poll_get(NULL);avahi_threaded_poll_start(poll);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android 应用兼容性变更调试
  • 【C语言知识-输出空格】C语言中输出空格的方法
  • C# ?的使用
  • 目标检测——X光安检数据集
  • 快速上手的企业视频会议系统需要具备哪些能力
  • 魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化
  • 【leetcode刷题之路】面试经典hot100(1)——哈希+双指针+滑动窗口+子串
  • HTMLCSS
  • 面试官:怎样设计一个分布式任务调度平台?
  • 【开源分享】PHP在线提交工单源码|工单管理系统源码 (附源码搭建教程)
  • STM32——外部中断(EXTI)
  • 【云原生】Job一次性任务详解
  • xss漏洞(二,xss靶场搭建以及简单利用)
  • 关于使用webflux开发思考
  • Animate软件基本概念:遮罩层和引导层
  • 分享一款快速APP功能测试工具
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【翻译】babel对TC39装饰器草案的实现
  • Angular Elements 及其运作原理
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • mysql_config not found
  • MySQL用户中的%到底包不包括localhost?
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Ruby 2.x 源代码分析:扩展 概述
  • tab.js分享及浏览器兼容性问题汇总
  • unity如何实现一个固定宽度的orthagraphic相机
  • WebSocket使用
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 分布式熔断降级平台aegis
  • 分类模型——Logistics Regression
  • 简单实现一个textarea自适应高度
  • 跨域
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端面试之CSS3新特性
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习笔记TF060:图像语音结合,看图说话
  • 智能合约开发环境搭建及Hello World合约
  • 容器镜像
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • # 透过事物看本质的能力怎么培养?
  • # 职场生活之道:善于团结
  • ###C语言程序设计-----C语言学习(6)#
  • (function(){})()的分步解析
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (接口封装)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转)jQuery 基础
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • @Autowired @Resource @Qualifier的区别