@@ -34,9 +34,10 @@ type Notifee interface {
34
34
}
35
35
36
36
type mdnsService struct {
37
- server * mdns.Server
38
- host host.Host
39
- tag string
37
+ server * mdns.Server
38
+ service * mdns.Resolver
39
+ host host.Host
40
+ tag string
40
41
41
42
lk sync.Mutex
42
43
notifees []Notifee
@@ -48,14 +49,19 @@ func NewMdnsService(ctx context.Context, peerhost host.Host, interval time.Durat
48
49
// TODO: dont let mdns use logging...
49
50
golog .SetOutput (ioutil .Discard )
50
51
51
- port := 4001
52
+ port := 42424
52
53
myid := peerhost .ID ().Pretty ()
53
54
54
55
info := []string {myid }
55
56
if serviceTag == "" {
56
57
serviceTag = ServiceTag
57
58
}
58
59
60
+ resolver , err := mdns .NewResolver (nil )
61
+ if err != nil {
62
+ log .Error ("Failed to initialize resolver:" , err )
63
+ }
64
+
59
65
// Create the mDNS server, defer shutdown
60
66
server , err := mdns .Register (myid , serviceTag , "" , port , info , nil )
61
67
if err != nil {
@@ -64,6 +70,7 @@ func NewMdnsService(ctx context.Context, peerhost host.Host, interval time.Durat
64
70
65
71
s := & mdnsService {
66
72
server : server ,
73
+ service : resolver ,
67
74
host : peerhost ,
68
75
interval : interval ,
69
76
tag : serviceTag ,
@@ -81,14 +88,8 @@ func (m *mdnsService) Close() error {
81
88
}
82
89
83
90
func (m * mdnsService ) pollForEntries (ctx context.Context ) {
84
-
85
91
ticker := time .NewTicker (m .interval )
86
92
for {
87
- resolver , err := mdns .NewResolver (nil )
88
- if err != nil {
89
- log .Error ("Failed to initialize resolver:" , err )
90
- }
91
-
92
93
//execute mdns query right away at method call and then with every tick
93
94
entriesCh := make (chan * mdns.ServiceEntry , 16 )
94
95
go func (results <- chan * mdns.ServiceEntry ) {
@@ -102,7 +103,7 @@ func (m *mdnsService) pollForEntries(ctx context.Context) {
102
103
ctx , cancel := context .WithTimeout (context .Background (), time .Second * 5 )
103
104
defer cancel ()
104
105
105
- if err := resolver .Browse (ctx , m .tag , "local" , entriesCh ); err != nil {
106
+ if err := m . service .Browse (ctx , m .tag , "local" , entriesCh ); err != nil {
106
107
log .Error ("mdns lookup error: " , err )
107
108
}
108
109
close (entriesCh )
@@ -123,9 +124,6 @@ func (m *mdnsService) handleEntry(e *mdns.ServiceEntry) {
123
124
// pull out the txt
124
125
info := strings .Join (e .Text , "|" )
125
126
126
- // addripv4 potential issue
127
- log .Debugf ("Handling MDNS entry: %s:%d %s" , e .AddrIPv4 [0 ], e .Port , info )
128
-
129
127
mpeer , err := peer .IDB58Decode (info )
130
128
if err != nil {
131
129
log .Warning ("Error parsing peer ID from mdns entry: " , err )
@@ -137,25 +135,29 @@ func (m *mdnsService) handleEntry(e *mdns.ServiceEntry) {
137
135
return
138
136
}
139
137
140
- maddr , err := manet .FromNetAddr (& net.TCPAddr {
141
- IP : e .AddrIPv4 [0 ],
142
- Port : e .Port ,
143
- })
144
- if err != nil {
145
- log .Warning ("Error parsing multiaddr from mdns entry: " , err )
146
- return
147
- }
138
+ for _ , ipv4 := range e .AddrIPv4 {
139
+ log .Debugf ("Handling MDNS entry: %s:%d %s" , ipv4 , e .Port , info )
148
140
149
- pi := pstore.PeerInfo {
150
- ID : mpeer ,
151
- Addrs : []ma.Multiaddr {maddr },
152
- }
141
+ maddr , err := manet .FromNetAddr (& net.TCPAddr {
142
+ IP : ipv4 ,
143
+ Port : e .Port ,
144
+ })
145
+ if err != nil {
146
+ log .Warning ("Error parsing multiaddr from mdns entry: " , err )
147
+ return
148
+ }
153
149
154
- m .lk .Lock ()
155
- for _ , n := range m .notifees {
156
- go n .HandlePeerFound (pi )
150
+ pi := pstore.PeerInfo {
151
+ ID : mpeer ,
152
+ Addrs : []ma.Multiaddr {maddr },
153
+ }
154
+
155
+ m .lk .Lock ()
156
+ for _ , n := range m .notifees {
157
+ go n .HandlePeerFound (pi )
158
+ }
159
+ m .lk .Unlock ()
157
160
}
158
- m .lk .Unlock ()
159
161
}
160
162
161
163
func (m * mdnsService ) RegisterNotifee (n Notifee ) {
0 commit comments