"github.com/anacrolix/log"
"github.com/anacrolix/missinggo"
"github.com/anacrolix/missinggo/bitmap"
+ "github.com/anacrolix/missinggo/conntrack"
"github.com/anacrolix/missinggo/perf"
"github.com/anacrolix/missinggo/pproffd"
"github.com/anacrolix/missinggo/pubsub"
}
return cl.config.PublicIp4
}(),
- StartingNodes: cl.config.DhtStartingNodes,
+ StartingNodes: cl.config.DhtStartingNodes,
+ ConnectionTracking: cl.config.ConnTracker,
}
s, err = dht.NewServer(&cfg)
if err == nil {
if peerNetworkEnabled(network, cl.config) {
left++
go func() {
+ cte := cl.config.ConnTracker.Wait(
+ conntrack.Entry{network, s.Addr().String(), addr},
+ "dial torrent client")
c, err := s.dial(ctx, addr)
// This is a bit optimistic, but it looks non-trivial to thread
// this through the proxy code. Set it now in case we close the
tc.SetLinger(0)
}
countDialResult(err)
- resCh <- dialResult{c, network}
+ dr := dialResult{c, network}
+ if c == nil {
+ cte.Done()
+ } else {
+ dr.Conn = closeWrapper{c, func() error {
+ err := c.Close()
+ cte.Done()
+ return err
+ }}
+ }
+ resCh <- dr
}()
}
return true
"github.com/anacrolix/dht"
"github.com/anacrolix/missinggo"
+ "github.com/anacrolix/missinggo/conntrack"
"github.com/anacrolix/missinggo/expect"
"github.com/anacrolix/torrent/iplist"
"github.com/anacrolix/torrent/storage"
// Don't add connections that have the same peer ID as an existing
// connection for a given Torrent.
dropDuplicatePeerIds bool
+
+ ConnTracker *conntrack.Instance
}
func (cfg *ClientConfig) SetListenAddr(addr string) *ClientConfig {
ListenHost: func(string) string { return "" },
UploadRateLimiter: unlimited,
DownloadRateLimiter: unlimited,
+ ConnTracker: conntrack.NewInstance(),
}
}