问题标签 [zeroconf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1385 浏览

bonjour - 多线程 avahi 解析导致段错误

我正在尝试将启用 zeronconf 的 C/C++ 应用程序移植到 Linux,但是我得到了与 D-BUS 相关的段错误。我不确定这是 Avahi 中的错误、我对 Avahi 的误用,还是我的代码中的错误。

我正在使用一个封装了 AvahiClient、AvahiSimplePoll 和 AvahiServiceResolver 的 ZeroconfResolver 对象。ZeroconfResolver 有一个 Resolve 函数,它首先实例化 AvahiSimplePoll,然后是 AvahiClient,最后是 AvahiServiceResolver。在每次实例化之前,我都会检查错误,然后再继续下一个。在成功创建 AvahiServiceResolver 后,它会使用 AvahiSimplePoll 调用 avahi_simple_poll_loop。

整个过程在同步完成时效果很好,但在同时异步使用多个 ZeroconfResolver 时会因段错误而失败(即,我有多个线程创建自己的 ZeroconfResolver 对象)。可以在下面的代码中看到重现段错误的对象的简单改编(可能不会立即产生段错误,但在我的用例中它经常发生)。

我了解“开箱即用”Avahi 不是线程安全的,但根据我对 [1] 的解释,只要不从超过一根线。每个 ZeroconfResolver 都有自己的一组 Avahi 对象,它们不会跨线程边界相互交互。

段错误发生在 Avahi 库中看似随机的函数中。通常,它们发生在引用 dbus 的 avahi_client_new 或 avahi_service_resolver_new 函数中。Avahi wiki 是否意味着暗示 AvahiClient/AvahiPoll 对象的“创建”也不是线程安全的?

[1] http://avahi.org/wiki/RunningAvahiClientAsThread

0 投票
1 回答
1585 浏览

c++ - 在 Windows 上使用 MFC 的 DNS-SD

我有一个使用 MFC 构建的应用程序,我需要将 Bonjour/Zeroconf 服务发现添加到其中。我在弄清楚如何最好地做到这一点时遇到了一些麻烦,但我决定使用 mDNSresponder 源代码中提供的 DLL 存根并将我的应用程序链接到由它生成的静态库(反过来使用系统dnssd.dll)。

但是,我仍然遇到问题,因为回调似乎并不总是被调用,所以我的设备发现停止了。让我感到困惑的是,在 OSX 下,使用 OSX dns-sd 终端服务和在 Windows 下使用 dns-sd 命令行服务,这一切都可以正常工作。在此基础上,我排除了客户端服务的问题,并试图找出我的 Windows 代码出了什么问题。

我基本上是在调用 DNSBrowseService(),然后在该回调中调用 DNSServiceResolve(),最后调用 DNSServiceGetAddrInfo() 来获取设备的 IP 地址,以便我可以连接到它。

所有这些调用都基于使用 WSAAsyncSelect,如下所示:

但有时即使服务在那里,回调也不会被调用,并且使用命令行会确认这一点。

我完全不知道为什么这不是 100% 可靠,但如果我在命令行中使用相同的 DLL,那就是这样。我唯一可能的解释是,DNSServiceResolve 函数尝试在 WSAAsyncSelect 为套接字注册处理消息之前调用回调函数,但我看不到任何解决方法。

我在这上面花了很长时间,现在完全没有想法了。任何建议都会受到欢迎,即使它们是“这是一种非常愚蠢的方法,你为什么不做 X、Y、Z”。

0 投票
1 回答
936 浏览

macos - Mono.ZeroConf Mac,找不到 Zeroconf 提供程序

我最近在 Windows 上使用 Mono.ZeroConf 构建了一个 bonjour 系统,并想尝试将其转换为 mac。我遇到了这个错误的问题:

没有找到或初始化 Zeroconf 提供程序。必要的守护进程可能没有运行。

我已经尝试过http://www.mono-project.com/Mono.Zeroconf提供的示例代码,并尝试使用我自己的 dll 和我自己的项目,这些项目是在 Windows 机器上构建的。两者都遇到相同的错误。

现在为了在 Windows 上解决这个问题,我安装了 Bonjour Print Services。我看不到 Mac 的等效版本,并认为无论如何都应该安装最新版本的 Bonjour。

只是想知道是否有人知道为什么会发生此错误?

干杯

0 投票
1 回答
2054 浏览

zeroconf - Alternatives to Bonjour for Windows

I'm looking to implement a ZeroConf application for Windows. I've noticed Bonjour and Mono.Zeroconf but was wondering if there were any decent alternatives?

0 投票
1 回答
826 浏览

bonjour - 在不知道 IP 的情况下连接到本地网络上的网站

我正在创建一个嵌入式设备(基于 RPi),它将连接到本地网络。我希望此设备能够通过网页配置设备(与许多路由器非常相似)。

我希望用户在 Web 浏览器中键入 [http://my-device-config](或其他一些固定地址)并被发送到配置页面,而无需知道设备的 IP 地址。

用户将采取的步骤如下:

  1. 用户将设备插入网络/打开设备。
  2. 用户在浏览器中输入“配置”地址并被带到配置页面。(无需网络配置/IP 查找等)

根据研究,我相信 Avahi (/Bonjour/Zeroconf) 可以使这成为可能,但我不清楚以下几点:

  1. Avahi 是最简单的方法吗?
  2. 如果我的设备是本地网络上运行 Avahi 的唯一设备,它会起作用吗?(即不需要在网络上的任何其他计算机上安装软件)。
  3. 它可以跨平台工作(osx/*nix/windows)吗?
  4. 它会跨浏览器工作吗?

感谢您的任何帮助/见解。

0 投票
2 回答
795 浏览

android - jmdns.jar 不适用于 android 4.0 或更高版本

jMdns是一个很棒的 java 库,可以为您的 Android 应用程序提供zeroconf / bonjour功能。

我在一个项目中成功地使用了它,直到Android 4.0 Ice Cream Sandwich aka ICS,一旦开始更频繁地使用 Android 4.0 设备,我就会面临应用程序无法正常工作。

我之前在 android 4.0 中测试过应用程序,它显示了发现设备列表,但在 android 4.0 或更高版本中它什么也没显示。

我已经在 4.1 上测试了这个演示“ https://github.com/twitwi/AndroidDnssdDemo ”,但它不起作用。

我根据“http://snctln.com/2012/08/03/jmdns-and-android-4-0/”中提到的建议编写了下面的代码

你的建议是可观的

0 投票
1 回答
858 浏览

timeout - 卓悦超时

当我关闭笔记本的盖子并使其进入睡眠状态时,网络中该笔记本的注册 bonjour 服务似乎不再在其他机器上消失。Bonjour 是否有我可以以某种方式设置的超时?

0 投票
2 回答
826 浏览

windows - Bonjour DNS-SD 回调没有被调用,我的代码哪里出错了?

我正在尝试使用这篇博客文章作为参考来学习如何使用 Bonjour:

http://marknelson.us/2011/10/25/dns-service-discovery-on-windows/

我已经下载了链接在该页面底部的示例项目,它就像魅力一样。现在我试图在我的控制台应用程序中从头开始重现服务发现:

DNSServiceBrowse返回kDNSServiceErr_NoError,但从不调用回调。怎么了?

0 投票
4 回答
1588 浏览

macos - 如何找出我的多播 (Bonjour) 主机名?

我已经使用 Bonjour API 注册了一条记录。现在我想知道我刚刚发布的记录的内容。我通过指定一个 NULL 主机名来创建它,意思是“使用守护程序的默认值”,但我找不到一个简单的方法来查询它是什么!

使用 avahi,这很容易:我调用avahi_client_get_host_name()以获取机器主机名的起始值。

对于 avahi 和 Bonjour,SRV 记录的值可以在注册的生命周期内更改 - 如果注册是使用 NULL 主机名完成的,则记录的主机名会在必要时自动更新。我在这里想要的只是一种在我执行注册时获取主机名初始值的方法。

请注意,在我的 Snow Leopard 测试机器上,默认的多播主机名来自gethostname(2).

我能想到的四个解决方案:

  1. 在我的过程中获取主机名。它可能在某个地方。我strings(3)对我的进程的内存转储进行了搜索,并在我的地址空间中找到了四个多播主机名实例,但这可能是巧合,因为该名称用于其他用途。即使我所追求的字符串在我的进程中的某个地方,我也找不到一个 API 来理​​智地检索它。
  2. 从守护进程查询主机名。可能有一些查询我可以通过 mach 端口发送到获取它的守护进程?我再也找不到 API 了。相关的代码块在 mDNSResponder 的 uDNS.c 文件中,并且似乎没有通过 RPC 接口公开。
  3. 我可以查找我注册的服务。不过,这可能会涉及一些网络流量,所以除非有一些保证不会发生,否则我不愿意这样做。
  4. 重新实现 uDNS.c 中的逻辑。它从以下组合中获取机器的主机名:

    • 动态 DNS 配置
    • 静态配置的多播主机名
    • 反向查找主接口的 IPv4 地址
    • 它特别不使用gethostname(2)或等效

    重新实现该逻辑似乎是不可行的。

目前,我倾向于进行查找以获取初始 SRV 注册的值,但这似乎并不理想。什么是正确的解决方案?

0 投票
2 回答
9727 浏览

linux - Avahi 主机名解析:它是否在某处缓存?

我正在使用 Fedora 18 和 avahi 命令行工具(版本 0.6.31)

我使用 avahi-resolve-host-name 来发现我的子网中单元的 IP 地址,以便在开发期间进行测试。我使用 Wireshark 监控请求和响应。在一个成功的请求和响应之后,Wireshark 上不会再显示更多请求,但该工具仍会返回一个 IP 地址。计算机/avahi守护进程/其他东西是否有可能“缓存”结果?

问题:我希望每次调用 avahi-resolve-host-name 都发送请求数据包。这可能吗?

原因:可以这么说,我得到了“误报”。我尝试解析“test1.local”,我得到了一个结果 IP,但该单元不再位于该 IP。我希望每次都发送请求,这样我就可以避免看到 IP 地址不正确的单元。