1 // Pings DHT nodes with the given network addresses.
12 "github.com/anacrolix/torrent/dht"
15 type pingResponse struct {
22 log.SetFlags(log.LstdFlags | log.Lshortfile)
23 timeout := flag.Duration("timeout", -1, "maximum timeout")
25 pingStrAddrs := flag.Args()
26 if len(pingStrAddrs) == 0 {
27 os.Stderr.WriteString("u must specify addrs of nodes to ping e.g. router.bittorrent.com:6881\n")
30 s, err := dht.NewServer(nil)
34 log.Printf("dht server on %s", s.Addr())
35 pingResponses := make(chan pingResponse)
36 timeoutChan := make(chan struct{})
38 for i, netloc := range pingStrAddrs {
40 time.Sleep(1 * time.Millisecond)
42 addr, err := net.ResolveUDPAddr("udp4", netloc)
46 t, err := s.Ping(addr)
51 t.SetResponseHandler(func(addr string) func(dht.Msg) {
52 return func(resp dht.Msg) {
53 pingResponses <- pingResponse{
56 rtt: time.Now().Sub(start),
68 for _ = range pingStrAddrs {
70 case resp := <-pingResponses:
75 fmt.Printf("%-65s %s\n", fmt.Sprintf("%x (%s):", resp.krpc["r"].(map[string]interface{})["id"].(string), resp.addr), resp.rtt)
80 // timeouts := len(pingStrAddrs) - responses
81 fmt.Printf("%d/%d responses (%f%%)\n", responses, len(pingStrAddrs), 100*float64(responses)/float64(len(pingStrAddrs)))