| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package dht
- import (
- "time"
- "github.com/anacrolix/dht/v2/int160"
- "github.com/anacrolix/dht/v2/krpc"
- )
- type nodeKey struct {
- Addr Addr
- Id int160.T
- }
- type node struct {
- nodeKey
- lastGotQuery time.Time // From the remote node
- lastGotResponse time.Time // From the remote node
- numReceivesFrom int
- failedLastQuestionablePing bool
- }
- func (s *Server) IsQuestionable(n *node) bool {
- return !s.IsGood(n) && !s.nodeIsBad(n)
- }
- func (n *node) hasAddrAndID(addr Addr, id int160.T) bool {
- return id == n.Id && n.Addr.String() == addr.String()
- }
- func (n *node) IsSecure() bool {
- return NodeIdSecure(n.Id.AsByteArray(), n.Addr.IP())
- }
- func (n *node) idString() string {
- return n.Id.ByteString()
- }
- func (n *node) NodeInfo() (ret krpc.NodeInfo) {
- ret.Addr = n.Addr.KRPC()
- if n := copy(ret.ID[:], n.idString()); n != 20 {
- panic(n)
- }
- return
- }
- // Per the spec in BEP 5.
- func (s *Server) IsGood(n *node) bool {
- if s.nodeIsBad(n) {
- return false
- }
- return time.Since(n.lastGotResponse) < 15*time.Minute ||
- !n.lastGotResponse.IsZero() && time.Since(n.lastGotQuery) < 15*time.Minute
- }
|