Add announcePeer feature.
TODO: fix sync write congestion control Request timeout
This commit is contained in:
46
dht/dht.go
46
dht/dht.go
@@ -8,6 +8,8 @@ import (
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"storrent/utp"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -18,39 +20,27 @@ const (
|
||||
|
||||
type DHT struct {
|
||||
conn *net.UDPConn
|
||||
in <-chan utp.Packet
|
||||
id [20]byte
|
||||
nodes []node
|
||||
pending map[string]chan *resp
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
func New(port int) (*DHT, error) {
|
||||
addr := &net.UDPAddr{Port: port}
|
||||
conn, err := net.ListenUDP("udp", addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
func New(conn *net.UDPConn, in <-chan utp.Packet) *DHT {
|
||||
d := &DHT{
|
||||
conn: conn,
|
||||
in: in,
|
||||
id: genNodeID(),
|
||||
pending: make(map[string]chan *resp),
|
||||
}
|
||||
go d.run()
|
||||
return d, nil
|
||||
}
|
||||
|
||||
func (d *DHT) Close() {
|
||||
d.conn.Close()
|
||||
return d
|
||||
}
|
||||
|
||||
func (d *DHT) run() {
|
||||
buf := make([]byte, 65535)
|
||||
for {
|
||||
n, _, err := d.conn.ReadFromUDP(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
msg, err := decodeMsg(buf[:n])
|
||||
for pkt := range d.in {
|
||||
msg, err := decodeMsg(pkt.Raw)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
@@ -237,3 +227,23 @@ func nextCandidate(candidates []node, queried map[string]bool) (node, int) {
|
||||
}
|
||||
return node{}, -1
|
||||
}
|
||||
|
||||
func (d *DHT) AnnouncePeer(ctx context.Context, h [20]byte, tokens map[string]string) {
|
||||
var wg sync.WaitGroup
|
||||
for addrStr, token := range tokens {
|
||||
addr, err := net.ResolveUDPAddr("udp", addrStr)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
wg.Add(1)
|
||||
go func(addr *net.UDPAddr, token string) {
|
||||
defer wg.Done()
|
||||
d.query(ctx, addr, announcePeer, args{
|
||||
InfoHash: h,
|
||||
ImpliedPort: 1,
|
||||
Token: token,
|
||||
})
|
||||
}(addr, token)
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user