dht

package
v0.0.0-...-361014b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 17, 2022 License: MIT Imports: 22 Imported by: 0

Documentation

Overview

Package dht implements the bittorrent dht protocol. For more information see http://www.bittorrent.org/beps/bep_0005.html.

Index

Constants

View Source
const (
	// StandardMode follows the standard protocol
	StandardMode = iota
	// CrawlMode for crawling the dht network.
	CrawlMode
)
View Source
const (
	// REQUEST represents request message type
	REQUEST = iota
	// DATA represents data message type
	DATA
	// REJECT represents reject message type
	REJECT
)
View Source
const (
	// BLOCK is 2 ^ 14
	BLOCK = 16384
	// MaxMetadataSize represents the max medata it can accept
	MaxMetadataSize = BLOCK * 1000
	// EXTENDED represents it is a extended message
	EXTENDED = 20
	// HANDSHAKE represents handshake bit
	HANDSHAKE = 0
)

Variables

View Source
var (
	// ErrNotReady is the error when DHT is not initialized.
	ErrNotReady = errors.New("dht is not ready")
	// ErrOnGetPeersResponseNotSet is the error that config
	// OnGetPeersResponseNotSet is not set when call dht.GetPeers.
	ErrOnGetPeersResponseNotSet = errors.New("OnGetPeersResponse is not set")
)

Functions

func Decode

func Decode(data []byte) (result interface{}, err error)

Decode decodes a bencoded string to string, int, list or map.

func DecodeDict

func DecodeDict(data []byte, start int) (
	result interface{}, index int, err error)

DecodeDict decodes a map value.

func DecodeInt

func DecodeInt(data []byte, start int) (
	result interface{}, index int, err error)

DecodeInt decodes int value in the data.

func DecodeList

func DecodeList(data []byte, start int) (
	result interface{}, index int, err error)

DecodeList decodes a list value.

func DecodeString

func DecodeString(data []byte, start int) (
	result interface{}, index int, err error)

DecodeString decodes a string in the data. It returns a tuple (decoded result, the end position, error).

func Encode

func Encode(data interface{}) string

Encode encodes a string, int, dict or list value to a bencoded string.

func EncodeDict

func EncodeDict(data map[string]interface{}) string

EncodeDict encodes a dict value.

func EncodeInt

func EncodeInt(data int) string

EncodeInt encodes a int value.

func EncodeList

func EncodeList(data []interface{}) string

EncodeList encodes a list value.

func EncodeString

func EncodeString(data string) string

EncodeString encodes a string value.

func ParseKey

func ParseKey(data map[string]interface{}, key string, t string) error

ParseKey parses the key in dict data. `t` is type of the keyed value. It's one of "int", "string", "map", "list".

func ParseKeys

func ParseKeys(data map[string]interface{}, pairs [][]string) error

ParseKeys parses keys. It just wraps ParseKey.

Types

type Config

type Config struct {
	// in mainline dht, k = 8
	K int
	// for crawling mode, we put all nodes in one bucket, so KBucketSize may
	// not be K
	KBucketSize int
	// candidates are udp, udp4, udp6
	Network string
	// format is `ip:port`
	Address string
	// the prime nodes through which we can join in dht network
	PrimeNodes []string
	// the kbucket expired duration
	KBucketExpiredAfter time.Duration
	// the node expired duration
	NodeExpriedAfter time.Duration
	// how long it checks whether the bucket is expired
	CheckKBucketPeriod time.Duration
	// peer token expired duration
	TokenExpiredAfter time.Duration
	// the max transaction id
	MaxTransactionCursor uint64
	// how many nodes routing table can hold
	MaxNodes int
	// callback when got get_peers request
	OnGetPeers func(string, string, int)
	// callback when receive get_peers response
	OnGetPeersResponse func(string, Peer)
	// callback when got announce_peer request
	OnAnnouncePeer func(string, string, int)
	// blcoked ips
	BlockedIPs []string
	// blacklist size
	BlackListMaxSize int
	// StandardMode or CrawlMode
	Mode int
	// the times it tries when send fails
	Try int
	// the size of packet need to be dealt with
	PacketJobLimit int
	// the size of packet handler
	PacketWorkerLimit int
	// the nodes num to be fresh in a kbucket
	RefreshNodeNum int
}

Config represents the configure of dht.

func NewCrawlConfig

func NewCrawlConfig() *Config

NewCrawlConfig returns a config in crawling mode.

func NewStandardConfig

func NewStandardConfig() *Config

NewStandardConfig returns a Config pointer with default values.

type DHT

type DHT struct {
	*Config

	Ready bool
	// contains filtered or unexported fields
}

DHT represents a DHT node.

func New

func New(logger *zap.Logger, config *Config) *DHT

New returns a DHT pointer. If config is nil, then config will be set to the default config.

func (*DHT) GetPeers

func (dht *DHT) GetPeers(infoHash string) error

GetPeers returns peers who have announced having infoHash.

func (*DHT) IsCrawlMode

func (dht *DHT) IsCrawlMode() bool

IsCrawlMode returns whether mode is CrawlMode.

func (*DHT) IsStandardMode

func (dht *DHT) IsStandardMode() bool

IsStandardMode returns whether mode is StandardMode.

func (*DHT) Run

func (dht *DHT) Run()

Run starts the dht.

type DHTErrorResponse

type DHTErrorResponse struct {
	TransactionID string
	ErrorCode     int
	ErrorMessage  string
}

func NewDHTErrorResponse

func NewDHTErrorResponse(transID string, errCode int, errMsg string) *DHTErrorResponse

func (*DHTErrorResponse) ToPayload

func (r *DHTErrorResponse) ToPayload() map[string]interface{}

type DHTPayload

type DHTPayload interface {
	ToPayload() map[string]interface{}
}

type DHTQuery

type DHTQuery struct {
	TransactionID string
	QueryType     DHTQueryType
	Arguments     map[string]interface{}
}

func NewDHTQuery

func NewDHTQuery(transID string, queryType DHTQueryType, args map[string]interface{}) *DHTQuery

func NewDHTQueryFromPayload

func NewDHTQueryFromPayload(payload map[string]interface{}) *DHTQuery

func (*DHTQuery) ToPayload

func (q *DHTQuery) ToPayload() map[string]interface{}

type DHTQueryResponse

type DHTQueryResponse struct {
	TransactionID string
	Arguments     map[string]interface{}
}

func NewDHTQueryResponse

func NewDHTQueryResponse(transID string, args map[string]interface{}) *DHTQueryResponse

func (*DHTQueryResponse) ToPayload

func (r *DHTQueryResponse) ToPayload() map[string]interface{}

type DHTQueryType

type DHTQueryType string
const (
	DHTQueryTypePing         DHTQueryType = "ping"
	DHTQueryTypeFindNode     DHTQueryType = "find_node"
	DHTQueryTypeGetPeers     DHTQueryType = "get_peers"
	DHTQueryTypeAnnouncePeer DHTQueryType = "announce_peer"
)

func (DHTQueryType) String

func (q DHTQueryType) String() string

type Node

type Node interface {
	ID() *bitmap
	IDRawString() string
	Address() *net.UDPAddr
	LastActiveTime() time.Time
	CompactIPPortInfo() string
	CompactNodeInfo() string
}

Node represents a DHT node.

func NewNode

func NewNode(id string, address *net.UDPAddr) Node

func NewNodeFromCompactInfo

func NewNodeFromCompactInfo(compactNodeInfo string, network string) (Node, error)

func NewNodeNetworkAddress

func NewNodeNetworkAddress(id, network, address string) (Node, error)

func NewTempNode

func NewTempNode(address *net.UDPAddr) Node

type Peer

type Peer interface {
	IP() net.IP
	Port() int
	Token() string
	CompactIPPortInfo() string
}

func NewPeer

func NewPeer(ip net.IP, port int, token string) Peer

func NewPeerFromCompactIPPortInfo

func NewPeerFromCompactIPPortInfo(compactInfo, token string) (Peer, error)

type Query

type Query struct {
	Node Node
	Data *DHTQuery
}

Query represents the query data included queried node and query-formed data.

type Request

type Request struct {
	InfoHash []byte
	IP       string
	Port     int
}

Request represents the request context.

type Response

type Response struct {
	Request
	MetadataInfo []byte
}

Response contains the request context and the metadata info.

type Transaction

type Transaction struct {
	*Query
	ID       string
	Response chan struct{}
}

Transaction implements transaction.

type TransactionMap

type TransactionMap struct {
	*sync.Map
}

func NewTransactionMap

func NewTransactionMap() *TransactionMap

func (TransactionMap) GetTransaction

func (m TransactionMap) GetTransaction(id string) (t *Transaction, ok bool)

func (TransactionMap) Has

func (m TransactionMap) Has(id string) bool

func (TransactionMap) Len

func (m TransactionMap) Len() (count int)

type Wire

type Wire struct {
	// contains filtered or unexported fields
}

Wire represents the wire protocol.

func NewWire

func NewWire(blackListSize, requestQueueSize, workerQueueSize int) *Wire

NewWire returns a Wire pointer.

  • blackListSize: the blacklist size
  • requestQueueSize: the max requests it can buffers
  • workerQueueSize: the max goroutine downloading workers

func (*Wire) Request

func (wire *Wire) Request(infoHash []byte, ip string, port int)

Request pushes the request to the queue.

func (*Wire) Response

func (wire *Wire) Response() <-chan Response

Response returns a chan of Response.

func (*Wire) Run

func (wire *Wire) Run()

Run starts the peer wire protocol.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL