forked from cenkalti/rain
/
torrent_connection.go
44 lines (41 loc) 路 1.2 KB
/
torrent_connection.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package torrent
import (
"net"
"github.com/ganqierwu/rain/internal/handshaker/incominghandshaker"
)
func (t *torrent) handleNewConnection(conn net.Conn) {
if len(t.incomingHandshakers)+len(t.incomingPeers) >= t.session.config.MaxPeerAccept {
t.log.Debugln("peer limit reached, rejecting peer", conn.RemoteAddr().String())
conn.Close()
return
}
ip := conn.RemoteAddr().(*net.TCPAddr).IP
ipstr := ip.String()
if t.session.config.BlocklistEnabledForIncomingConnections && t.session.blocklist != nil && t.session.blocklist.Blocked(ip) {
t.log.Debugln("peer is blocked:", conn.RemoteAddr().String())
conn.Close()
return
}
if _, ok := t.connectedPeerIPs[ipstr]; ok {
t.log.Debugln("received duplicate connection from same IP: ", ipstr)
conn.Close()
return
}
if _, ok := t.bannedPeerIPs[ipstr]; ok {
t.log.Debugln("connection attempt from banned IP: ", ipstr)
conn.Close()
return
}
h := incominghandshaker.New(conn)
t.incomingHandshakers[h] = struct{}{}
t.connectedPeerIPs[ipstr] = struct{}{}
go h.Run(
t.peerID,
t.getSKey,
t.checkInfoHash,
t.incomingHandshakerResultC,
t.session.config.PeerHandshakeTimeout,
t.session.extensions,
t.session.config.ForceIncomingEncryption,
)
}