我想创建一个C ++应用程序,可以(部分地)使用UDP在局域网上的用户之间进行通信。应用程序的每个实例都有一个专用于侦听应用程序的其他实例并将其存在性广播到其他实例的线程。
使用纯C ++和POSIX系统调用是否有可靠的方法在LAN上执行此类广播/侦听?我知道在局域网上找不到所有IP的通用方法都没有,但我认为这只是因为其他设备不愿意响应ping。
答案 0 :(得分:2)
不要重新发明轮子。现有两种技术,结合起来,以标准化,精心设计,经过验证的方式解决您的问题:
_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,...),您将获得支持您的协议的本地网络上所有主机的列表。