forked from fangj99/spider
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfind.go
84 lines (74 loc) · 1.59 KB
/
find.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package spider
import (
"fmt"
"math/rand"
"net"
"time"
"github.com/zeebo/bencode"
)
//BOOTSTRAP define
var BOOTSTRAP = []string{
"router.bittorrent.com:6881",
"router.utorrent.com:6881",
"dht.transmissionbt.com:6881",
}
var findDelayTime = time.Millisecond * 50
//FindNode find node
func (dhtNode *DhtNode) FindNode(v map[string]interface{}, args map[string]string, node *KNode) {
countFindRequest++
var id ID
if node.ID != nil {
id = node.ID.Neighbor(dhtNode.node.ID)
} else {
id = dhtNode.node.ID
}
v["t"] = fmt.Sprintf("%d", rand.Intn(100))
v["y"] = "q"
v["q"] = "find_node"
args["id"] = string(id)
args["target"] = string(GenerateID())
v["a"] = args
data, err := bencode.EncodeBytes(v)
if err != nil {
logger(err)
return
}
raddr := new(net.UDPAddr)
raddr.IP = node.IP
raddr.Port = node.Port
err = dhtNode.network.Send(data, raddr)
if err != nil {
logger(err)
return
}
}
//NodeFinder node finder
func (dhtNode *DhtNode) NodeFinder() {
if len(dhtNode.table.Nodes) == 0 {
val := make(map[string]interface{})
args := make(map[string]string)
for _, host := range BOOTSTRAP {
raddr, err := net.ResolveUDPAddr("udp", host)
if err != nil {
logger("Resolve DNS error, %s\n", err)
return
}
node := new(KNode)
node.Port = raddr.Port
node.IP = raddr.IP
node.ID = nil
dhtNode.FindNode(val, args, node)
}
}
val := make(map[string]interface{})
args := make(map[string]string)
for {
node := dhtNode.table.Pop()
if node != nil {
dhtNode.FindNode(val, args, node)
time.Sleep(findDelayTime)
continue
}
time.Sleep(time.Second)
}
}