From c7cf369ed820d3468daca2312698a1d2770cd6b9 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 21 Jul 2016 21:10:37 +0200 Subject: Poll --- cmd/btcheck/main.go | 11 ++++++----- tracker/messages.go | 24 ++++++++++++++++++++++++ tracker/peer.go | 4 ++-- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/cmd/btcheck/main.go b/cmd/btcheck/main.go index aff241b..d9162d8 100644 --- a/cmd/btcheck/main.go +++ b/cmd/btcheck/main.go @@ -35,10 +35,11 @@ func main() { Compact: true, Port: 6881, } - resp, err := req.Send(tor.Announce) - if err != nil { - log.Fatal(err) + pool := make(map[string]tracker.Peer) + for p := range req.Poll(tor.Announce) { + if _, ok := pool[p.IP]; !ok { + log.Println("new peer", p) + pool[p.IP] = p + } } - fmt.Println(resp.Interval) - fmt.Println(resp.Peers) } diff --git a/tracker/messages.go b/tracker/messages.go index 96cc069..3c739e8 100644 --- a/tracker/messages.go +++ b/tracker/messages.go @@ -3,6 +3,7 @@ package tracker import ( "crypto/sha1" "io/ioutil" + "log" "net" "net/http" "time" @@ -51,6 +52,29 @@ type Response struct { WarningMessage string `bencode:"warning message"` } +func (r *Request) Poll(announce string) chan Peer { + c := make(chan Peer) + go func() { + defer close(c) + for { + resp, err := r.Send(announce) + if err != nil { + log.Println(err) + return + } + for _, p := range resp.Peers { + c <- p + } + if resp.Interval == 0 { + resp.Interval = DefaultInterval + } + log.Println("waiting", resp.Interval) + time.Sleep(resp.Interval) + } + }() + return c +} + func (r Request) Send(announce string) (Response, error) { fail := func(err error) (Response, error) { return Response{}, err diff --git a/tracker/peer.go b/tracker/peer.go index 686dca9..81b1175 100644 --- a/tracker/peer.go +++ b/tracker/peer.go @@ -12,12 +12,12 @@ import ( type Peer struct { IP string `bencode:"ip"` - ID []byte `bencode:"peer id"` + ID []byte `bencode:"peer id"` // not present in compact mode Port int `bencode:"port"` } func (p Peer) String() string { - return fmt.Sprint(p.IP, url.QueryEscape(string(p.ID)), p.Port) + return fmt.Sprintf("%v:%v %v", p.IP, p.Port, url.QueryEscape(string(p.ID))) } type Peers []Peer -- cgit v1.2.3