首页 > 系统相关 >Windows下mDNS查询API—DnsStartMulticastQuery/DnsStopMulticastQuery的使用

Windows下mDNS查询API—DnsStartMulticastQuery/DnsStopMulticastQuery的使用

时间:2023-11-22 21:58:42浏览次数:47  
标签:mDNS r1 Windows DnsStartMulticastQuery 查询 API DNS QUERY

背景及问题:

目前很多局域网设备通过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左右延时

 

标签:mDNS,r1,Windows,DnsStartMulticastQuery,查询,API,DNS,QUERY
From: https://www.cnblogs.com/stephen2023/p/17707101.html

相关文章

  • windows 文件授权问题
    跨平台可执行权限介绍在类Unix系统(如Mac,Linux)中,执行权限是通过文件的权限位来控制的。而在Windows系统中,执行权限通常取决于文件扩展名和关联的执行程序,所以,当我们在跨平台的开发环境中,可能会遇到这样一个问题:在Windows系统上创建的脚本文件缺乏类Unix系统上的执行权......
  • Windows7下ELectron应用的Input输入框在拼音输入中的失焦问题?
    Windows7下ELectron应用的Input输入框在拼音输入中的失焦问题主要是为了解决虚拟键盘(使用的simple-keyboard)的拼音输入问题(Windows自带的虚拟键盘因为不够方便和美观,所以没有采用;simple-keyboard其实也支持拼音输入,但是更不好用),最后决定通过Koffi(ffi,ffi-napi)调用user32.dll,模拟......
  • C/C++ 实现Windows注册表操作
    Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被用于存储各种系统和应用程序的配置信息。以下是注册表的一些基本概念:键(Key):注册表中的数据结构,类似于文......
  • windows安装QT时出现“无法下载存档……”解决办法
    参考windows、Ubuntu安装QT时经常出现“无法下载存档……”解决办法-CSDN博客使用国内源安装:清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/北京理工大学:http://mirror.bit.edu.cn/qtproject/中国互联网络信息中心:http://mirror.bit.edu.cn/qtproject/步骤:在qt的exe......
  • 更改Windows的远程桌面端口
    摘自:https://cloud.tencent.com/developer/article/1557774方法一:工具下载地址:https://pan.baidu.com/s/1Rt3ZFXY0sOD5okeb9VI3_A方法二:命令1.执行以下命令(将以下所有的36970更为新的要更改的端口后再执行):regadd"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control......
  • Windows server 2022下载地址
    【Windowsserver2022】ed2k://|file|zh-cn_windows_server_2022_updated_sep_2023_x64_dvd_892eeda9.iso|5525116928|9ADE79B3BC3923E9DD241206E263D611|/magnet:?xt=urn:btih:eaa74aadaac68f481156bad27f153e7e215b4dba&dn=zh-cn_windows_server_2022_updated_sep_2023_......
  • 嵌入式和移动设备系统先驱:Windows CE 彻底退役
    导读诞生于1996年的Windows嵌入式操作系统——WindowsCE(WindowsEmbeddedCompact)本月迎来了它的生命周期终点。诞生于1996年的Windows嵌入式操作系统——WindowsCE(WindowsEmbeddedCompact)本月迎来了它的生命周期终点。WindowsCE最初是Window......
  • win2win(windows之间局域网文件传输)
    简介这是一个基于C语言编写的控制台程序,可以在VS平台下编译。使用场景由于Windows之间自带的文件共享太费事,步骤太繁琐,于是参考网络文章Ctrl+C了一个凑出了一个小工具,主要实现网线直连或者同网段的局域网内的两台Windows电脑之间的文件传输。程序基于TCP协议传输,因此在......
  • windows 搭建 swoole开发环境
    1.下载:swoole官网下载swoole-cli-v5.0.3-cygwin-x64.zip只支持64位的系统 2.解压到指定文件夹:C:\phpstudy_pro\swoole-cli-v5.0.3-cygwin-x64 3.设置环境变量:把解压后的文件夹下的bin目录路径配置到系统的Path环境变量中,确定保存 4.检查安装情况:打开命令行输入:s......
  • change windows cmd prompt 修改windows命令行提示符
    通过修改环境变量控制cmd提示符。 refcmd-HowdoIchangethecommand-linepromptinWindows?-StackOverflowhttps://stackoverflow.com/questions/12028372/how-do-i-change-the-command-line-prompt-in-windowsAbetterPROMPTforCMD.EXEorCoolPromptEnv......