如何在局域网上实现设备发现的最佳方法?

13

我在网络编程方面的经验不多,正在编写一个需要每个设备能够在同一局域网内找到其他设备的多平台系统。我正在寻找正确的方法来做到这一点,并希望在这里的人们可以给出好的建议。以下是我的设计要求:

  1. 我在使用C++,解决方案需要跨平台,至少能够在iOS、Windows、Android上运行。

  2. 该系统应该比较轻量级,并且在没有特殊设置或网络要求的情况下工作,如果可能的话。

以下是我正在考虑的不同方法:

  1. 使用uPnP协议,但我对它并不是非常熟悉,而且似乎没有很多关于这个主题的带有代码的示例。

  2. 使用传统的socket方法,在每个设备上创建Server/Client,并将数据包发送到局域网中的每个IP。然后手动处理所有内容。如果我向广播地址发送数据包,是否意味着系统会自动将我的数据包发送到子网内的每个IP?

  3. 使用外部服务器,所有客户端都将注册到该服务器,然后从该服务器获取关于其他(已注册)客户端的信息。但是,我不确定每个客户端应连接哪些信息才能确定它们在同一局域网中。

让我知道我在想什么是否有意义。非常感谢任何建议。


通常会向广播地址发送UDP数据包,其中包含用于稍后建立常规连接的设置信息。发送到广播地址的数据包将发送到子网中的每个设备。我建议启动Wireshark来查看幕后发生的情况。 - Brad
谢谢提供信息,但我听说路由器可以设置停止广播,而且在局域网中通常是默认设置。这是真的吗?如果是,那么这种方法就不太可靠了。 - NachoChip
1
不,路由器位于您的网络和另一个网络之间。广播数据包仅发送到您的网络,因此路由器的配置对它们没有影响。此外,如果路由器能够这样做,您的网络将无法正常工作。广播数据包对基本功能非常重要,例如DHCP、UPnP和Bonjour(例如Marko的答案中所述)。 - Brad
1个回答

4

你没有列出的一个选择是ZeroConf's DNS-SD协议。

苹果公司广泛使用它,并将其营销为Bonjour(前身为Rendezvous)。 iOS和MacOSX有紧密的集成。
苹果还提供了Windows实现、SDK并开源了mDNS服务。

Android似乎已经默认支持它out of the box

对于Linux来说,有一个稳健而成熟的支持形式,即Avahi,包含在大多数桌面发行版中。

似乎唯一需要用户安装任何东西的平台是Windows,即使如此,它也随着iTunes(用于音乐库共享)和任何苹果无线接入点的设置软件一起安装。


FYI - 注意一下:http://superuser.com/questions/730288/why-do-some-wifi-routers-block-multicast-packets-going-from-wired-to-wireless - hooby3dfx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接