背景及问题:

目前很多局域网设备通过mNDS协议实现互联,IP地址为自动IP段-169.254.x.x,有时候设备厂家提供的API需要通过知晓局域网中的IP地址/设备名,才能连接该设备。这样要求每个软件必须配置设备名或者启动时遍历所有IP(6w+),不是很方便,这时候可以通过mDNS查询,自动拿到设备名,再进行连接,相对便捷,高效。

解决办法:

在Win10 版本中,windows提供了mDNS查询的API-DnsStartMulticastQuery,官方定义如下:

其中PMDNS_QUERY_REQUEST定义为

其中各字段定义如下:

Version 必须 DNS_QUERY_REQUEST_VERSION1结构版本
ulRefCount 保留。 请勿使用。
Query 表示要通过 mDNS 查询的名称的字符串。
QueryType 一个值,该值表示要查询的记录的类型。有关可能的值,请参阅DNS_RECORD_TYPE 。
QueryOptions 一个表示查询选项的 值。 DNS_QUERY_STANDARD 是唯一支持的值。
InterfaceIndex 一个 值,该值包含要播发服务的接口索引。 如果 InterfaceIndex 为 0,则将考虑所有接口。
pQueryCallback

指向类型为 MDNS_QUERY_CALLBACK) 的函数 (的指针,该函数表示每当 mDNS 结果可用时要异步调用的回调

pQueryContext 指向用户上下文的指针。
fAnswerReceived 保留。 请勿使用。
ulResendCount 保留。 请勿使用

需要注意的是:

Query是所查询的字符串, pQueryCallback是查询等到回复的回调函数,定义如下:

其中PDNS_QUERY_RESULT含有查询结果DNS_RECORD ,对该结构体进行解析可以得到结果。拿到结果之后需要使用 DnsRecordListFree 函数释放空间。

示例程序:

#include<Windows.h>
#include"mdns.h" #pragma comment(lib, "dnsapi.lib") VOID WINAPI multicastQueryCallback(PVOID pQueryContext, PMDNS_QUERY_HANDLE pQueryHandle, PDNS_QUERY_RESULT pQueryResults)
{
//pQueryResults为返回结果,对其中的pQueryRecords进行解析
if (pQueryResults->pQueryRecords)
{
//解析查询结果 // 释放空间
dnsRecordListFree(pQueryResults->pQueryRecords,DnsFreeRecordList)
) } void GetQueryResponse(const wchar_t* queryName)
{
MDNS_QUERY_HANDLE h1;
MDNS_QUERY_REQUEST r1;
int context = 222;
r1.Version = DNS_QUERY_REQUEST_VERSION1;
r1.QueryOptions = DNS_QUERY_STANDARD;
r1.QueryType = DNS_TYPE_PTR;
r1.Query = queryName;
r1.pQueryContext = (PVOID)context;
r1.InterfaceIndex = 0;
r1.pQueryCallback = multicastQueryCallback; DnsStartMulticastQuery(&r1, &h1); Sleep(100);
DnsStopMulticastQuery(&h1); }

需要注意的是:

  1. 目前该API似乎不是很稳定, Release/X64,双字节字符串(VS字符集需设置为Unicode)平台下使用没有问题
  2. 此方法为异步查询,如果不使用DnsStopMulticastQuery结束查询,则查询字符串会一直发送,回调函数会被一直调用。
  3. pQueryContext可以用来存储查询结果(示例中没有使用)
  4. QueryOptions设为DNS_QUERY_BYPASS_CACHE可以绕过缓存查询,每次查询最新的结果
  5. 同样的Release/X64平台, DnsQuery API也可以查询,且支持单双字符串,但是DNS_QUERY_BYPASS_CACHE不起作用;同步查询,有1s左右延时

Windows下mDNS查询API—DnsStartMulticastQuery/DnsStopMulticastQuery的使用的更多相关文章

  1. windows下tensorflow/objectdetection API环境搭建(基于tensorflow1.14和python3.6)

    此前就听闻室友说tensorflow在windows下坑很多,这次终于亲身领会到了.以下是参考网上大佬的教程以及自己的踩坑史总结出的有效步骤(亲测有效) 1.下载objectdetection所在的m ...

  2. Windows下使用ODBC API访问数据库之关键

    本文采用SQL2005 + VS2008环境,以ODBC API方式成功连接数据库. 1.SQL安装和环境配置 这部分网上随便搜一下都有很多资料,而且很容易就可以配置成功. 注意的关键点: SA账号配 ...

  3. windows 下实现函数打桩:拦截API方式

    windows 下实现函数打桩:拦截API方式            近期由于工作须要,開始研究函数打桩的方法. 由于不想对project做过多的改动,于是放弃了使用Google gmock的想法. ...

  4. windows下的c语言和linux 下的c语言以及C标准库和系统API

    1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作 ...

  5. 在Windows下编写并运行第一个ASP.NET 5 Preview Web API程序

    2015年07月21日在微软中国MSDN的官方微博上得知Visual Studio 2015正式版完美发布. 抱着尝鲜的心态下载了Visual Studio社区版本. 在这个首发的版本里面,我们可以看 ...

  6. TensorFlow Object Detection API(Windows下训练)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 最近事情比较多,前面坑挖的有点久,今天终于有时间总结一下,顺便把Windows下训练跑通.Li ...

  7. 转:mysql日志(Windows下开启Mysql慢查询、通用日志)

    一.Windows下开启Mysql慢查询详解 //show variables like '%quer%';查询是否开启了慢查询!! 第一步:修改my.ini(mysql配置文件)  在my.ini中 ...

  8. 如何使用在Windows 下AspNetCore Api 和 consul

    在Windows 下如何使用 AspNetCore Api 和 consul https://blog.csdn.net/sD7O95O/article/details/80750803 一.概念:什 ...

  9. Windows下获取逻辑cpu数量和cpu核数量(用GetLogicalProcessorInformation,从XP3才开始有的API)

    代码可在Windows NT下正常运行 具体API说明请参照如下文档: GetLogicalProcessorInformation 点击打开链接 点击打开链接 点击打开链接 typedef BOOL ...

  10. windows下使用pycharm开发基于ansible api的python程序

    Window下python安装ansible,基于ansible api开发python程序 在windows下使用pycharm开发基于ansible api的python程序时,发现ansible ...

随机推荐

  1. win32 - 基于hwnd获取进程名字(GetModuleFileNameEx)

    #include <Windows.h> #include <psapi.h> int main() { DWORD process_ID = 0; WCHAR process ...

  2. 【Android逆向】滚动的天空中插入smali日志

    1. 编写一个MyLog.java 放到一个android工程下,编译打包,然后反编译拿到MyLog的smali代码 package com.example.logapplication; impor ...

  3. 如何拓展jwt返回的数据

    默认的返回值仅有token,我们还需在返回值中增加username和id,方便在客户端页面中显示当前登陆用户 通过修改该视图的返回值可以完成我们的需求. 在user/utils.py中,创建 def ...

  4. chrony同步时间

    chrony文件组成 包:chrony 两个主要程序:chronyd和chronyc - chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务同步.它确定计算机增减时间的比率,并 ...

  5. 狂神说Git学习笔记整理

    Git 版本控制 ​ 在开发过程中,项目会进行版本迭代,新版本会取代旧版本,但是我们不希望直接删除旧版本,所以就需要一个版本管理器来管理新旧版本,不然就是手动控制... 多人开发必须使用版本控制!!! ...

  6. 矩池云 | GPU 分布式使用教程之 Pytorch

    GPU 分布式使用教程之 Pytorch Pytorch 官方推荐使用 DistributedDataParallel(DDP) 模块来实现单机多卡和多机多卡分布式计算.DDP 模块涉及了一些新概念, ...

  7. 【Azure Function App】Java Function在运行中遇见内存不足的错误

    问题描述 在Function的Code+Test界面进行函数触发可以成功.因为Function为Blob Trigger,当在Blob容器下上传文件后,Function可以被正常触发但是报 outof ...

  8. C++函数模板总结:

    //C++提高编程 模板(泛型编程 STL)//模板不可以直接使用 它只是一个框架//模板的通用并不是万能的//语法//template<typename T>//函数模板两种方式//1. ...

  9. 科技大厂、手机厂商、企服领域齐发力,手机智能体成AI Agent新趋势

    AI Agent涌向移动终端,手机智能体势不可挡 还没搞清楚什么是AI Agent,手机Agent就已经横空出世 AIGC为何涌向移动端?背后有哪些逻辑?什么是手机智能体?一文看明白 科技大厂.手机厂 ...

  10. 魅族16T屏幕尺子