Add announcePeer feature.

TODO:
	fix sync write
	congestion control
	Request timeout
This commit is contained in:
2026-01-22 13:55:29 +09:00
parent 60ec9c19ea
commit aa0c61139f
6 changed files with 102 additions and 68 deletions

View File

@@ -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()
}