C ++应用程序:在LAN上发现其他IP

时间:2017-11-12 21:48:32

标签: c++ linux networking udp posix

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

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

1 个答案:

答案 0 :(得分:2)

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

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

因此,我们有一个协议允许我们向DNS询问有关服务的问题,我们有一个协议允许我们让一组主机回答DNS查询...当我们将两者放在一起时,我们得到了一种询问方式主机服务!这两种协议的组合有时被称为Zeroconf网络,并且已经在macOS,iOS,tvOS和watchOS(其中称为Bonjour),Android,大多数Unices(通过Avahi,这两种协议的可移植实现)中实现,和许多家用设备,如电视。例如。 Spotify Connect,ChromeCast,飞利浦Hue和其他许多人也都以此为基础。例如,这是iTunes设备在本地网络上相互查找的方式。

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

那么,你基本上要做的是向mDNS多播组发送一个mDNS查询并询问_myprotocol._udp.local.然后,假设你的应用程序注册了自己的操作系统的mDNS服务(即macj上的Bonjour,Avahi on Unices,...),您将获得支持您的协议的本地网络上所有主机的列表。