让TCP客户端寻找TCP服务器

3

背景

我正在使用SparkCore无线arduino板连接到本地Node.js服务器。该服务器包括一个本地内部TCP服务器,SparkCore上编程的TCP客户端连接到该服务器。

问题

如果我在不同的网络上运行服务器,则服务器具有不同的本地IP地址。这样做时,我必须重新编程SparkCore arduino,告诉它连接其TCP客户端的新本地IP地址。出于各种原因,这不是理想的选择。

问题

是否有一种方法可以使客户端动态搜索TCP服务器或者让服务器以某种方式向TCP客户端广播,以通知客户端要使用的服务器本地IP地址,而不是最初硬编码?我希望以一种不需要迭代特定端口上的一堆IP来查看是否建立连接的方式来实现这一点。话虽如此,如果这是唯一的方法,那就这样做吧。


2
您可以让服务器在一个端口上同时监听UDP广播。当广播到达时,向源地址发送回复。客户端只需发送广播,然后等待一段时间以获取回复。 - perh
它能够工作是因为UDP有不针对特定IP的选项。您可以将数据包发送到广播地址(或本地组播组,在ipv6的情况下),所有连接到本地网络的计算机都将看到该数据包。(如果您运行ifconfig,则在ipv4中,这将是“bcast”或“broadcast”中的地址,在ipv6中则更加简单和复杂) - perh
那么这将是来自服务器的广播地址,对吗? - mbeasley
1
此外,广播和组播消息将在您的局域网之外被阻止(即使在局域网内,如果路由器/防火墙/其他设备设置为阻止它们)。 - Lesto
1
客户端将向本地网络广播地址发送数据包。服务器将侦听任何地址(*,::,0或您选择的API/语言中的任何地址)。当它检测到数据包时,它会向源(即客户端IP#)发送回复。客户端随后可以使用该数据包的源地址作为数据包(使用recvfrom接收时方便地已经可用)。如上所述,UDP不是可靠的,但足够可靠。如果未收到回复,请让客户端重复请求。 - perh
显示剩余2条评论
1个回答

1
如果arduino使用DHCP引导,一种方法是提供一个客户DHCP选项,该选项提供node.js服务器的地址。例如,ntp可以以类似的方式进行配置。这样做的好处是,arduino不需要在与node.js服务器相同的本地子网上。
另一种选择(稍微有些恶心)是在您的域内使用A记录(假设为nodejs.example.com)。将本地DNS递归服务器配置为显式返回此值(我假设您可能具有许多不同的部署,其中包含许多不同的nodejs服务器)。
第三种可能性是发送某种形式的发现数据包,可以通过广播或更好的组播UDP实现。假设它在同一LAN上,nodejs服务器可以回复。显然,您可能需要关注冒充您的nodejs服务器的恶意服务器,并因此需要添加一些安全性(例如,使用共享密钥,发送随机nonce加上已使用共享密钥哈希的nonce到服务器,服务器检查哈希并回复答案、nonce加上用于哈希共享密钥和nonce的答案,每个客户端都会检查)。

我能否通过让服务器广播UDP发现数据包(循环发送),并让客户端监听它来反转UDP选项?这是为了开发和测试,所以安全性目前不是问题。 - mbeasley

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