client.go | 23 +++++++++++++++++++++++ diff --git a/client.go b/client.go index 4382d6bdfd2f8d2d9b7a5f2607e5239b3ab9961f..20957caea2f843b0645a8b3dc6f658453bc042c4 100644 --- a/client.go +++ b/client.go @@ -1301,7 +1301,30 @@ err = cl.addTorrent(t.torrent) if err != nil { t.Close() } + go cl.connectionPruner(t.torrent) return +} + +func (cl *Client) connectionPruner(t *torrent) { + for { + time.Sleep(15 * time.Second) + cl.mu.Lock() + license := len(t.Conns) - (socketsPerTorrent+1)/2 + for _, c := range t.Conns { + if license <= 0 { + break + } + if time.Now().Sub(c.lastUsefulChunkReceived) < time.Minute { + continue + } + if time.Now().Sub(c.completedHandshake) < time.Minute { + continue + } + c.Close() + license-- + } + cl.mu.Unlock() + } } func (me *Client) DropTorrent(infoHash InfoHash) (err error) {