DNS-SD
This library implements Multicast DNS and DNS-Based Service Discovery to provide zero-configuration operations. It lets you announce and find services in a specific link-local domain.
Usage
Create a mDNS responder
The following code creates a service with name "My Website._http._tcp.local." for the host "My Computer" which has all IPs from network interface "eth0". The service is added to a responder.
import (
"context"
"github.com/brutella/dnssd"
)
cfg := dnssd.Config{
Name: "My Website",
Type: "_http._tcp",
Domain: "local",
Host: "My Computer",
Ifaces: []string{"eth0"},,
Port: 12345,
}
sv, _ := dnssd.NewService(cfg)
In most cases you only need to specify the name, type and port of the service.
cfg := dnssd.Config{
Name: "My Website",
Type: "_http._tcp",
Port: 12345,
}
sv, _ := dnssd.NewService(cfg)
Then you create a responder and add the service to it.
rp, _ := dnssd.NewResponder()
hdl, _ := rp.Add(sv)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
rp.Respond(ctx)
When calling Respond
the responder probes for the service instance name and host name to be unqiue in the network.
Once probing is finished, the service will be announced.
Update TXT records
Once a service is added to a responder, you can use the hdl
to update properties.
hdl.UpdateText(map[string]string{"key1": "value1", "key2": "value2"}, rsp)
dnssd
command
The command line tool in cmd/dnssd
lets you browse, register and resolve services similar to dns-sd.
Install
You can install the tool with
go install github.com/brutella/dnssd/cmd/dnssd
Usage
Registering a service on your local machine
Lets register a printer service (_printer._tcp
) running on your local computer at port 515 with the name "Private Printer".
dnssd register -Name="Private Printer" -Type="_printer._tcp" -Port=515
Registering a proxy service
If the service is running on a different machine on your local network, you have to specify the hostname and IP.
Lets say the printer service is running on the printer with the hostname ABCD
and IPv4 address 192.168.1.53
, you can register a proxy which announce that service on your network.
dnssd register -Name="Private Printer" -Type="_printer._tcp" -Port=515 -IP=192.168.1.53 -Host=ABCD
Use option -Interface
, if you want to announce the service only on a specific network interface.
This might be necessary if your local machine is connected to multiple subnets and your announced service is only available on a specific subnet.
dnssd register -Name="Private Printer" -Type="_printer._tcp" -Port=515 -IP=192.168.1.53 -Host=ABCD -Interface=en0
Browsing for a service
If you want to browse for a service type, you can use the browse
command.
dnssd browse -Type="_printer._tcp"
Resolving a service instance
If you know the name of a service instance, you can resolve its hostname with the resolve
command.
dnssd resolve -Name="Private Printer" -Type="_printer._tcp"
Conformance
This library passes the multicast DNS tests of Apple's Bonjour Conformance Test.
TODO
- Support hot plugging
- Support negative responses (RFC6762 6.1)
- Handle txt records case insensitive
- Remove outdated services from cache regularly
- Make sure that hostnames are FQDNs
Contact
Matthias Hochgatterer
Github: https://github.com/brutella
Twitter: https://twitter.com/brutella
License
dnssd is available under the MIT license. See the LICENSE file for more info.