首页 > 解决方案 > 用 `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。

标签: c#uwpwindows-10bonjourdns-sd

解决方案


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 示例程序解决了这个问题。


推荐阅读