Vra

I'm writing a piece of software that will run on computers as well as phones.

The service uses an HTTP API for communication and will be published over the local network using Zeroconf.

Initially I published my service using _http._tcp. as the service type but I quickly discovered that both my NAS and my music receiver(!) also broadcasts themselves with that exact service type.

So the question now arises how to differentiate between my service and other services that are using HTTP.

Alternatives

Using a different service type

The is certainly the most certainly the easiest way and (almost) guarantees no other services will be picked up.

However, according to Apple1 new services should be registered with IANA. This is obviously not required but seeing as they recommend it it feels like it would be the wrong way to do it

Using the TXT record

Apple2 describes the TXT record like this:

When a service is registered, three related DNS records are created: a service (SRV) record, a pointer (PTR) record, and a text (TXT) record. The TXT record contains additional data needed to resolve or use the service, although it is also often empty.

The certainly feels like it could be the right way to do it, but I'm still not sure and it's hard to find a description of what the field should contain.

My first though would be to put something like <service_name>-<version> which will then be parsed to see which service it actually is.

My NAS seems to use this for identifying model and version numbers.

Try talking to the service

After finding a service one could always perform a HEAD request on a known endpoint and look for a known header set by the service.

This feels like a fairly slow approach and who knows what making a HEAD request to my receiver will do.


And just to be clear, this question has nothing to do with a specific language or framework, it's about the concepts of zeroconf.

I could show some code but I don't see how that would help.

Was dit nuttig?

Oplossing

First, does the service you're advertising actually meet the qualifications for _http as defined by RFC 2782. Specifically- is it not just using HTTP for a transport but is also:

  • can be displayed by "typical" web browser client software, and
  • is intended primarily to be viewed by a human user.

If no, register your own service type (there are a couple other services that use HTTP as a transport but don't meet those qualifications so they have -http as a suffix to the service name, see pgpkey-http, senteo-http, xul-http).

If yes, there are a couple ways to go depending on how strict one's interpretation of the RFC is. The least strict being just adding a TXT record as you've already noted in your question. iTunes registers itself with a TXT record in the format iTSh Version=196618.

If you're feeling a little more strict, the RFC only explicitly states that the u=, p= and path= TXT records exist for HTTP. Perhaps someone can chime in on this, but I haven't seen much discussion on whether adding TXT records to already existing entries is frowned upon or not. So with that, the other way is to just an algorithmic instance name. For example, adding the suffix "-NicklasAService" to the device name. Hopefully giving it a unique name to the local network but still making it so that the service can be easily picked out by the PTR record by just looking for the suffix.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top