绑定到 mac os x 上的 mdns 多播地址

发布于 2024-12-03 14:52:59 字数 281 浏览 3 评论 0原文

我想绑定到 mac os x 计算机上的多播 DNS 组和端口,以构建一些 bonjour 功能的原型。但是,当我尝试绑定到端口时,出现以下错误(顺便说一句,这是从 python 运行的):

socket.error: [Errno 48] Address already in use

看起来 mDNSResponder 绑定到了地址:端口,但未设置 SO_REUSEADDR。

是否可以以允许其他代理绑定到地址:端口组合的方式运行 mDNSResponder?

I want to bind to the multicast DNS group and port on a mac os x machine to prototype some bonjour functionality. However, when I try to bind to the port I get the following error (incidentally this is run from python):

socket.error: [Errno 48] Address already in use

It looks like the mDNSResponder binds to the address:port with SO_REUSEADDR unset.

Is it possible to run the mDNSResponder in a way that lets other agents bind to the address:port combination?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北城挽邺 2024-12-10 14:52:59

在这种情况下,错误代码描述可能会有点混乱。当应用程序绑定到端口而不设置 SO_REUSEPORT 选项时,如果第二个应用程序尝试绑定到同一端口,则绑定将失败并出现上述错误。问题不在于绑定地址,而在于端口和 SO_REUSEPORT 标志。

顺便说一句,在 Linux 下,等效的(多个多播侦听器)功能是通过使用 SO_REUSEADDR 标志来实现的(根据 Linux 上的 SO_REUSEPORT)。

第一个应用程序必须设置 SO_REUSEPORT 标志进行绑定,否则它将具有独占绑定,并且其他应用程序绑定将失败。例如:

# For BSD based platforms.
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind(('', MCAST_PORT))

事实证明,mDNSResponder 可以在设置 SO_REUSEPORT 标志的情况下启动,但前提是它在服务启动时无法独占绑定。您可以执行以下操作以使其进入此模式:

  1. 关闭 mDNSResponder 服务 (更多信息此处
  2. 使用 SO_REUSEPORT 与您的应用程序绑定到地址:端口
  3. 重新启动 mDNSResponder 服务

mDNSResponder 服务将使用 SO_REUSEPORT 标志启动和绑定。然后其他应用程序可以共享该端口,直到下次重新启动。您可能需要重新启动任何使用 bonjour 的应用程序,因为它们已注册到旧的 mDNSResponder 实例。

The error code description may be a little confusing in this situation. When an application binds to a port without setting the SO_REUSEPORT option, if a second application tries to bind to the same port the bind will fail with the above error. The problem is not with the binding address though, but with the port and the SO_REUSEPORT flag.

As an aside, under linux the equivalent (multiple multicast listeners) functionality is achieved by using the SO_REUSEADDR flag (as per SO_REUSEPORT on linux).

The first application has to bind with the SO_REUSEPORT flag set, otherwise it will have an exclusive bind and other application binds will fail. For example:

# For BSD based platforms.
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind(('', MCAST_PORT))

It turns out that the mDNSResponder can start with the SO_REUSEPORT flag set, but only if it fails to bind exclusively when the service is started. You can do the following to make it go into this mode:

  1. Shutdown the mDNSResponder service (more info here)
  2. Bind to the address:port with your application using SO_REUSEPORT
  3. Restart the mDNSResponder service

The mDNSResponder service will start and bind using the SO_REUSEPORT flag. Other applications can then share the port until the next reboot. You may need to restart any applications that use bonjour as they will have been registered to the old mDNSResponder instance.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文