OSDN Git Service

rename vapord (#277)
[bytom/vapor.git] / p2p / discover / mdns / mdns.go
1 package mdns
2
3 import (
4         "context"
5
6         "github.com/grandcat/zeroconf"
7 )
8
9 const (
10         instanceName = "vapord"
11         serviceName  = "lanDiscover"
12         domainName   = "local"
13 )
14
15 // Protocol decoration ZeroConf,which is a pure Golang library
16 // that employs Multicast DNS-SD.
17 type Protocol struct {
18         entries chan *zeroconf.ServiceEntry
19         server  *zeroconf.Server
20         quite   chan struct{}
21 }
22
23 // NewProtocol create a specific Protocol.
24 func NewProtocol() *Protocol {
25         return &Protocol{
26                 entries: make(chan *zeroconf.ServiceEntry),
27                 quite:   make(chan struct{}),
28         }
29 }
30
31 func (m *Protocol) getLanPeerLoop(event chan LANPeerEvent) {
32         for {
33                 select {
34                 case entry := <-m.entries:
35                         event <- LANPeerEvent{IP: entry.AddrIPv4, Port: entry.Port}
36                 case <-m.quite:
37                         return
38                 }
39         }
40 }
41
42 func (m *Protocol) registerService(port int) error {
43         var err error
44         m.server, err = zeroconf.Register(instanceName, serviceName, domainName, port, nil, nil)
45         return err
46 }
47
48 func (m *Protocol) registerResolver(event chan LANPeerEvent) error {
49         go m.getLanPeerLoop(event)
50         resolver, err := zeroconf.NewResolver(nil)
51         if err != nil {
52                 return err
53         }
54
55         return resolver.Browse(context.Background(), serviceName, domainName, m.entries)
56 }
57
58 func (m *Protocol) stopResolver() {
59         close(m.quite)
60 }
61
62 func (m *Protocol) stopService() {
63         if m.server != nil {
64                 m.server.Shutdown()
65         }
66 }