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

l'

参考链接: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 通过协议发送给客户端。

c 复制代码
#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;
}
c 复制代码
/*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;
}
相关推荐
弹简特16 分钟前
【JavaSE-网络部分05】TCP 可靠性 + 高性能的三大核心机制:滑动窗口・流量控制・拥塞控制
网络·网络协议·tcp/ip
Highcharts.js25 分钟前
数据更新方案对比|HTTP轮询 vs WebSocket,如何为你的图表选择最佳方案
websocket·网络协议·http·数据更新·highcharts·http轮询·图表数据更新
李庆政37026 分钟前
modbus协议四 rtu Over tcp & mbslave & CRC校验码计算方法
网络协议·tcp/ip·modbus·rtu over tcp
安静轨迹12 小时前
TLS_SSL 警报码完整手册
网络·网络协议·ssl
F1FJJ18 小时前
Shield CLI PostgreSQL 插件现已上架 VS Code 扩展市场
网络·vscode·网络协议·postgresql·开源软件
jinanwuhuaguo20 小时前
OpenClaw全网使用人群全景深度分析报告
网络·人工智能·网络协议·rpc·openclaw
努力的lpp20 小时前
小迪安全第10天:HTTP数据包分析与构造
网络协议·安全·http
带娃的IT创业者21 小时前
WeClaw_41_桌面端与PWA文件双向传输:WebSocket与HTTP混合协议设计
websocket·网络协议·http·文件传输·pwa
i建模21 小时前
python, conda SSL证书错误修复及conda更新
网络协议·conda·ssl
FPGA小迷弟1 天前
FPGA工程师面试题汇总(九)
网络协议·tcp/ip·fpga开发·面试·verilog·fpga