gpt4 book ai didi

C++ 应用程序 : discover other IPs on LAN

转载 作者:太空宇宙 更新时间:2023-11-04 09:16:20 28 4
gpt4 key购买 nike

我想创建一个 C++ 应用程序,可用于(部分)使用 UDP 在局域网上的用户之间进行通信。应用程序的每个实例都将有一个线程专用于监听应用程序的其他实例并将其存在广播给其他实例。

是否有一种可靠的方法可以使用纯 C++ 和 POSIX 系统调用在 LAN 上执行此类广播/收听?我知道没有普遍可靠的方法可以找到 LAN 上的所有 IP,但我认为这只是因为其他设备不愿意响应 ping。

最佳答案

不要重新发明轮子。有两种现有技术,结合使用后,可以以标准化、精心设计、经过验证的方式解决您的问题:

  • RFC6762 mDNS (Multicast DNS)是一种工作方式几乎与 DNS 完全相同的协议(protocol),只是它使用 IP 多播方式工作。您不是将 DNS 请求发送到单播地址,而是将 DNS 请求发送到多播组,该组的任何成员都可以回答您的请求(因此您可能会得到多个答案)。
  • RFC6763 DNS-SD (DNS-based Service Discovery)是一种将服务编码为 DNS 条目的方法,它允许您使用特殊编码的主机名从 DNS 检索服务。 (例如,查找主机名 _ipp._tcp.example.com 将返回支持域 example.com 中基于 TCP 的互联网打印协议(protocol)的所有打印机的列表)

因此,我们有一个协议(protocol)允许我们向 DNS 询问服务,我们有一个协议(protocol)允许我们要求一组主机回答 DNS 查询……当我们将两者放在一起时,我们得到了一种询问方式主机服务!这两种协议(protocol)的组合有时称为 Zeroconf 网络,并且已经在 macOS、iOS、tvOS 和 watchOS(称为 Bonjour)、Android、大多数 Unices(通过 Avahi,这两种协议(protocol)的可移植实现)中实现,和许多家用设备,例如电视。例如。 Spotify Connect、ChromeCast、Philips Hue 和许多其他产品也基于它。例如,iTunes 设备就是通过它在本地网络上找到彼此的。

不幸的是,Windows 中的支持仍然有限,目前它似乎只存在于以 ECMAScript 实现的 Windows 10 应用程序中。 (但是,没有什么能阻止您将自己的实现与您的应用一起发布,据我所知,Avahi 和 Apple 的 mDNSResponder 都可以在 Windows 上运行。)

因此,您基本上要做的是向 mDNS 多播组发送 mDNS 查询并请求 _myprotocol._udp.local。 然后,假设您的应用程序将自己注册到操作系统的 mDNS 服务(即 macOS 上的 Bonjour,Unices 上的 Avahi,……),您将获得本地网络上支持您的协议(protocol)的所有主机的列表。

关于C++ 应用程序 : discover other IPs on LAN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47254381/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com