背景及问题:

目前很多局域网设备通过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. Oracle system identifier already exists specify another SID

    问题说明 Centos7重装Oracle,使用DBCA重新创建实例test的时候报错,中文意思是: Oracle系统标识符(SID)"test"已存在,请指定另一个SID. 问题原 ...

  2. Java集合框架学习(十四) Iterator接口详解

    Iterator接口介绍 public interface Iterator<E> iterator 用于迭代集合类型对象,例如: HashMap, ArrayList, LinkedLi ...

  3. 如何避免Git合并远程分支时出现可读性差的日志

    问题及现象 当某一分支(假设为main)的本地仓库和远程仓库都基于同一个提交进行了修改,并分别创建了新的提交时,在本地执行git push origin main会提示先要执行git pull合并远程 ...

  4. 2021-10-25 css中零值0后面是否要省略单位

    原理 在css中如果值为0,可以省略单位. 在css应用场景中,有可能是多端多人维护.即可能维护的人有A及B及C-,应用场景中有电脑端及手机端及小程序及打印机之类的. 结论 个人认为不要省略单位,不要 ...

  5. 用Taro写一个微信小程序——Taro3路由传参

    参考https://docs.taro.zone/docs/router 1.传入参数 Taro.navigateTo({ url: '/pages/page/path/name?id=2&t ...

  6. 程序员应具备的PS基本技能(三):程序员使用PSD源文件切图

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. 【LeetCode链表#11】环形链表II(双指针)

    环形链表II 力扣题目链接(opens new window) 题意: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,使用整数 pos 来表示 ...

  8. 【LeetCode数组#1二分法】二分查找、搜索插入、在排序数组中查找元素的第一个和最后一个位置

    二分查找 题目 力扣704题目链接 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 ...

  9. gopkg.in/go-playground/validator中比较有用的标签

    -  忽略|  或omitempty 有则验证,空值则不验证dive  潜入到切片.数组.映射中,例如 NumList []int `validate:"len=2,dive,gt=18&q ...

  10. C/C++、C#、JAVA(三):字符串操作

    C/C++.C#.JAVA(三):字符串操作 目录 C/C++.C#.JAVA(三):字符串操作 定义字符串 C C++ C# JAVA 捕捉输入和输出 等值比较 C/C++ C# JAVA 字符串操 ...