c# - 用 `ServiceDiscovery.Dnssd` 做广告,用 Bonjour 发现?
问题描述
Windows.Networking.ServiceDiscovery.Dnssd
命名空间是否允许广告可通过 Apple 的 Bonjour 发现的服务?
Microsoft 的文档提到了所有正确的 DNS-SD RFC,但我无法使用此Bonjour Browser 程序发现我的程序。我知道 Bonjour Browser 程序正在运行,因为它会发现我网络上的其他设备以及通过mDNSResponder
. 微软关于这个命名空间的文档非常模糊,让我感到疑惑。
这段代码中有什么明显错误的地方吗?
async Task RegisterServiceAsync()
{
var hostNames = NetworkInformation
.GetHostNames()
.Where(x => x.Type == HostNameType.DomainName)
.Select(x => new KeyValuePair<string, HostName>(x.ToString(), x))
.ToList();
var hostName = Pick("Pick a host name:", hostNames);
Console.WriteLine($"Host name is \"{hostName}\"");
var service = new DnssdServiceInstance(
dnssdServiceInstanceName: "abc._tcp.local.",
hostName: hostName,
port: 13337
);
using (var socket = new StreamSocketListener())
{
var registration = await service.RegisterStreamSocketListenerAsync(socket);
Console.WriteLine(registration.Status);
Console.WriteLine($"Renamed: {registration.HasInstanceNameChanged}");
Console.WriteLine($"Service instance name: {service.DnssdServiceInstanceName}");
Console.ReadKey(true);
}
}
示例输出:
1) 主机名.域.本地 2) 主机名.local 选择一个主机名:(1-2) 2 主机名是“hostname.local” 成功 更名:假 服务实例名称:abc._tcp.local。
解决方案
dnssdServiceInstanceName
格式错误。它需要是<<instance name>>._<<service name>>._<<protocol>>.<<domain>>.
。例如,此代码有效:
async Task RegisterServiceAsync()
{
var hostNames = NetworkInformation
.GetHostNames()
.Where(x => x.Type == HostNameType.DomainName)
.Select(x => new KeyValuePair<string, HostName>(x.ToString(), x))
.ToList();
var hostName = Pick("Pick a host name:", hostNames);
Console.WriteLine($"Host name is \"{hostName}\"");
var service = new DnssdServiceInstance(
dnssdServiceInstanceName: "instanceName._abcservice._tcp.local.",
hostName: hostName,
port: 13337
);
using (var socket = new StreamSocketListener())
{
var registration = await service.RegisterStreamSocketListenerAsync(socket);
Console.WriteLine(registration.Status);
Console.WriteLine($"Renamed: {registration.HasInstanceNameChanged}");
Console.WriteLine($"Service instance name: {service.DnssdServiceInstanceName}");
Console.ReadKey(true);
}
}
我使用这行Microsoft 示例程序解决了这个问题。
推荐阅读
- android - Firebase setPersistenceEnabled(true) 下载的数据怎么样
- android - android things manifest.xml 中的 bindservice 选项 ACTION_BOOT_COMPLETED
- reactjs - 超过最大更新深度。渲染方法中没有直接的函数调用
- python - “__init__”中的 Python 3.5 'master' 和 'widgetName'
- apache-spark - 写入 Kafka 压缩主题的 Spark 代码
- kubernetes - 公开集群内的入口路径但不公开?
- node.js - 来自 create-react-app 的 express serve index.html
- swift - RxAlamofire 请求在我第二次调用该函数时没有被触发
- c# - 在 Unity 2D 中根据鼠标屏幕位置更改动画
- angular - 角度 7 - 在数据表中重新加载数据