3

我正在编写一个可以在电脑和手机上运行的软件。

该服务使用 HTTP API 进行通信,并将使用 Zeroconf 在本地网络上发布。

最初我使用_http._tcp.服务类型发布了我的服务,但我很快发现我的 NAS 和我的音乐接收器(!)也使用该确切的服务类型广播自己。

所以现在的问题是如何区分我的服务和其他使用 HTTP 的服务。

备择方案

使用不同的服务类型

这当然是最简单的方法,并且(几乎)保证不会使用其他服务。

但是,根据 Apple 1 ,新服务在 IANA 注册。这显然不是必需的,但看到他们推荐它,感觉这是错误的做法

使用 TXT 记录

Apple 2是这样描述 TXT 记录的:

注册服务时,会创建三个相关的 DNS 记录:服务 (SRV) 记录、指针 (PTR) 记录和文本 (TXT) 记录。TXT 记录包含解析或使用服务所需的其他数据,尽管它通常也是空的。

当然感觉这可能是正确的方法,但我仍然不确定,很难找到该字段应包含的内容的描述。

我的第一个想法是放置类似<service_name>-<version>which 的内容,然后对其进行解析以查看它实际上是哪个服务。

我的 NAS 似乎使用它来识别型号和版本号。

尝试与服务交谈

找到服务后,总是可以HEAD在已知端点上执行请求并查找服务设置的已知标头。

这感觉像是一种相当缓慢的方法,谁知道HEAD向我的接收者发出请求会做什么。


需要明确的是,这个问题与特定的语言或框架无关,它与 zeroconf 的概念有关。

我可以显示一些代码,但我看不出这有什么帮助。

4

1 回答 1

1

首先,您所宣传的服务是否真正符合RFC 2782_http所定义的资格。具体来说,它不仅使用 HTTP 进行传输,而且还:

  • 可以通过“典型的”网络浏览器客户端软件显示,并且
  • 主要供人类用户查看。

如果不是,请注册您自己的服务类型(还有一些其他服务使用 HTTP 作为传输,但不符合这些条件,因此它们-http作为服务名称的后缀,请参阅pgpkey-http, senteo-http, xul-http)。

如果是的话,有几种方法可以走,这取决于一个人对 RFC 的解释有多严格。正如您在问题中已经指出的那样,最不严格的只是添加TXT记录。iTunes 使用 格式的TXT记录注册自己iTSh Version=196618

如果您感觉更严格一点,RFC 仅明确声明HTTP 存在u=,p=path=TXT 记录。也许有人可以对此发表意见,但我还没有看到太多关于将 TXT 记录添加到现有条目中是否会受到反对的讨论。因此,另一种方法是仅使用算法实例名称。例如,在设备名称中添加后缀“-NicklasAService”。希望给它一个唯一的名称给本地网络,但仍然让它可以通过 PTR 记录轻松地通过查找后缀来挑选服务。

于 2014-01-13T19:37:12.990 回答