func (cl *Client) announceTorrent(t *torrent) {
req := tracker.AnnounceRequest{
- Event: tracker.Started,
- NumWant: -1,
- Port: cl.listenerAnnouncePort(),
+ Event: tracker.Started,
+ NumWant: -1,
+ Port: cl.listenerAnnouncePort(),
+ PeerId: cl.PeerId,
+ InfoHash: t.InfoHash,
}
- req.PeerId = cl.PeerId
- req.InfoHash = t.InfoHash
newAnnounce:
for {
+ req.Left = t.BytesLeft()
for _, tier := range t.Trackers {
for trIndex, tr := range tier {
if err := tr.Connect(); err != nil {
Port: peer.Port,
})
}
- if err := cl.AddPeers(t.InfoHash, peers); err != nil {
+ err = cl.AddPeers(t.InfoHash, peers)
+ if err != nil {
log.Print(err)
- return
+ } else {
+ log.Printf("%s: %d new peers from %s", t, len(peers), tr)
}
- log.Printf("%s: %d new peers from %s", t, len(peers), tr)
tier[0], tier[trIndex] = tier[trIndex], tier[0]
time.Sleep(time.Second * time.Duration(resp.Interval))
+ req.Event = tracker.None
continue newAnnounce
}
}
- time.Sleep(time.Second)
+ time.Sleep(5 * time.Second)
}
}
return t.MetaInfo.Name
}
+func (t *torrent) BytesLeft() (left int64) {
+ for i := peer_protocol.Integer(0); i < peer_protocol.Integer(t.NumPieces()); i++ {
+ left += int64(t.PieceNumPendingBytes(i))
+ }
+ return
+}
+
func (t *torrent) NumPieces() int {
return len(t.MetaInfo.Pieces) / pieceHash.Size()
}