65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
|
package dht
|
||
|
|
||
|
import (
|
||
|
"magneticod/dht/mainline"
|
||
|
"net"
|
||
|
"github.com/bradfitz/iter"
|
||
|
)
|
||
|
|
||
|
|
||
|
type TrawlingManager struct {
|
||
|
// private
|
||
|
output chan mainline.TrawlingResult
|
||
|
services []*mainline.TrawlingService
|
||
|
}
|
||
|
|
||
|
|
||
|
func NewTrawlingManager(mlAddrs []net.UDPAddr) *TrawlingManager {
|
||
|
manager := new(TrawlingManager)
|
||
|
manager.output = make(chan mainline.TrawlingResult)
|
||
|
|
||
|
if mlAddrs != nil {
|
||
|
for _, addr := range mlAddrs {
|
||
|
manager.services = append(manager.services, mainline.NewTrawlingService(
|
||
|
addr,
|
||
|
mainline.TrawlingServiceEventHandlers{
|
||
|
OnResult: manager.onResult,
|
||
|
},
|
||
|
))
|
||
|
}
|
||
|
} else {
|
||
|
addr := net.UDPAddr{IP: []byte("\x00\x00\x00\x00"), Port: 0}
|
||
|
for range iter.N(1) {
|
||
|
manager.services = append(manager.services, mainline.NewTrawlingService(
|
||
|
addr,
|
||
|
mainline.TrawlingServiceEventHandlers{
|
||
|
OnResult: manager.onResult,
|
||
|
},
|
||
|
))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for _, service := range manager.services {
|
||
|
service.Start()
|
||
|
}
|
||
|
|
||
|
return manager
|
||
|
}
|
||
|
|
||
|
|
||
|
func (m *TrawlingManager) onResult(res mainline.TrawlingResult) {
|
||
|
m.output <- res
|
||
|
}
|
||
|
|
||
|
|
||
|
func (m *TrawlingManager) Output() <-chan mainline.TrawlingResult {
|
||
|
return m.output
|
||
|
}
|
||
|
|
||
|
|
||
|
func (m *TrawlingManager) Terminate() {
|
||
|
for _, service := range m.services {
|
||
|
service.Terminate()
|
||
|
}
|
||
|
}
|