Documentation

Index

Constants

View Source
const (
	// These are documented in BEP 5.
	ErrorCodeGenericError  = 201
	ErrorCodeServerError   = 202
	ErrorCodeProtocolError = 203
	ErrorCodeMethodUnknown = 204
	// BEP 44
	ErrorCodeMessageValueFieldTooBig       = 205
	ErrorCodeInvalidSignature              = 206
	ErrorCodeSaltFieldTooBig               = 207
	ErrorCodeCasHashMismatched             = 301
	ErrorCodeSequenceNumberLessThanCurrent = 302
)

Variables

View Source
var ErrorMethodUnknown = Error{
	Code: ErrorCodeMethodUnknown,
	Msg:  "Method Unknown",
}

Functions

This section is empty.

Types

type CompactIPv4NodeAddrs

type CompactIPv4NodeAddrs []NodeAddr

func (CompactIPv4NodeAddrs) ElemSize

func (CompactIPv4NodeAddrs) ElemSize() int

func (CompactIPv4NodeAddrs) MarshalBencode

func (me CompactIPv4NodeAddrs) MarshalBencode() ([]byte, error)

func (CompactIPv4NodeAddrs) MarshalBinary

func (me CompactIPv4NodeAddrs) MarshalBinary() ([]byte, error)

func (CompactIPv4NodeAddrs) NodeAddrs

func (me CompactIPv4NodeAddrs) NodeAddrs() []NodeAddr

func (*CompactIPv4NodeAddrs) UnmarshalBencode

func (me *CompactIPv4NodeAddrs) UnmarshalBencode(b []byte) error

func (*CompactIPv4NodeAddrs) UnmarshalBinary

func (me *CompactIPv4NodeAddrs) UnmarshalBinary(b []byte) error

type CompactIPv4NodeInfo

type CompactIPv4NodeInfo []NodeInfo

func (CompactIPv4NodeInfo) ElemSize

func (CompactIPv4NodeInfo) ElemSize() int

func (CompactIPv4NodeInfo) MarshalBencode

func (me CompactIPv4NodeInfo) MarshalBencode() ([]byte, error)

func (CompactIPv4NodeInfo) MarshalBinary

func (me CompactIPv4NodeInfo) MarshalBinary() ([]byte, error)

func (*CompactIPv4NodeInfo) UnmarshalBencode

func (me *CompactIPv4NodeInfo) UnmarshalBencode(b []byte) error

func (*CompactIPv4NodeInfo) UnmarshalBinary

func (me *CompactIPv4NodeInfo) UnmarshalBinary(b []byte) error

type CompactIPv6NodeAddrs

type CompactIPv6NodeAddrs []NodeAddr

func (CompactIPv6NodeAddrs) ElemSize

func (CompactIPv6NodeAddrs) ElemSize() int

func (CompactIPv6NodeAddrs) MarshalBencode

func (me CompactIPv6NodeAddrs) MarshalBencode() ([]byte, error)

func (CompactIPv6NodeAddrs) MarshalBinary

func (me CompactIPv6NodeAddrs) MarshalBinary() ([]byte, error)

func (CompactIPv6NodeAddrs) NodeAddrs

func (me CompactIPv6NodeAddrs) NodeAddrs() []NodeAddr

func (*CompactIPv6NodeAddrs) UnmarshalBencode

func (me *CompactIPv6NodeAddrs) UnmarshalBencode(b []byte) error

func (*CompactIPv6NodeAddrs) UnmarshalBinary

func (me *CompactIPv6NodeAddrs) UnmarshalBinary(b []byte) error

type CompactIPv6NodeInfo

type CompactIPv6NodeInfo []NodeInfo

func (CompactIPv6NodeInfo) ElemSize

func (CompactIPv6NodeInfo) ElemSize() int

func (CompactIPv6NodeInfo) MarshalBencode

func (me CompactIPv6NodeInfo) MarshalBencode() ([]byte, error)

func (CompactIPv6NodeInfo) MarshalBinary

func (me CompactIPv6NodeInfo) MarshalBinary() ([]byte, error)

func (*CompactIPv6NodeInfo) UnmarshalBencode

func (me *CompactIPv6NodeInfo) UnmarshalBencode(b []byte) error

func (*CompactIPv6NodeInfo) UnmarshalBinary

func (me *CompactIPv6NodeInfo) UnmarshalBinary(b []byte) error

type Error

type Error struct {
	Code int
	Msg  string
}

    Represented as a string or list in bencode.

    func (Error) Error

    func (e Error) Error() string

    func (Error) MarshalBencode

    func (e Error) MarshalBencode() (ret []byte, err error)

    func (*Error) UnmarshalBencode

    func (e *Error) UnmarshalBencode(_b []byte) (err error)

    type ID

    type ID [20]byte

    func IdFromString

    func IdFromString(s string) (id ID)

    func (ID) MarshalBencode

    func (id ID) MarshalBencode() ([]byte, error)

    func (*ID) UnmarshalBencode

    func (id *ID) UnmarshalBencode(b []byte) error

    type Msg

    type Msg struct {
    	Q        string   `bencode:"q,omitempty"` // Query method (one of 4: "ping", "find_node", "get_peers", "announce_peer")
    	A        *MsgArgs `bencode:"a,omitempty"` // named arguments sent with a query
    	T        string   `bencode:"t"`           // required: transaction ID
    	Y        string   `bencode:"y"`           // required: type of the message: q for QUERY, r for RESPONSE, e for ERROR
    	R        *Return  `bencode:"r,omitempty"` // RESPONSE type only
    	E        *Error   `bencode:"e,omitempty"` // ERROR type only
    	IP       NodeAddr `bencode:"ip,omitempty"`
    	ReadOnly bool     `bencode:"ro,omitempty"`
    }

      Msg represents messages that nodes in the network send to each other as specified by the protocol. They are also referred to as the KRPC messages. There are three types of messages: QUERY, RESPONSE, ERROR The message is a dictonary that is then "bencoded" (serialization & compression format adopted by the BitTorrent) and sent via the UDP connection to peers.

      A KRPC message is a single dictionary with two keys common to every message and additional keys depending on the type of message. Every message has a key "t" with a string value representing a transaction ID. This transaction ID is generated by the querying node and is echoed in the response, so responses may be correlated with multiple queries to the same node. The transaction ID should be encoded as a short string of binary numbers, typically 2 characters are enough as they cover 2^16 outstanding queries. The other key contained in every KRPC message is "y" with a single character value describing the type of message. The value of the "y" key is one of "q" for query, "r" for response, or "e" for error. 3 message types: QUERY, RESPONSE, ERROR

      func (Msg) Error

      func (m Msg) Error() *Error

      func (Msg) SenderID

      func (m Msg) SenderID() *ID

        The node ID of the source of this Msg. Returns nil if it isn't present. TODO: Can we verify Msgs more aggressively so this is guaranteed to return a valid ID for a checked Msg?

        func (Msg) String

        func (m Msg) String() string

        type MsgArgs

        type MsgArgs struct {
        	ID          ID     `bencode:"id"`                     // ID of the querying Node
        	InfoHash    ID     `bencode:"info_hash,omitempty"`    // InfoHash of the torrent
        	Target      ID     `bencode:"target,omitempty"`       // ID of the node sought
        	Token       string `bencode:"token,omitempty"`        // Token received from an earlier get_peers query
        	Port        *int   `bencode:"port,omitempty"`         // Sender's torrent port
        	ImpliedPort bool   `bencode:"implied_port,omitempty"` // Use senders apparent DHT port
        	Want        []Want `bencode:"want,omitempty"`         // Contains strings like "n4" and "n6" from BEP 32.
        	NoSeed      int    `bencode:"noseed,omitempty"`       // BEP 33
        	Scrape      int    `bencode:"scrape,omitempty"`       // BEP 33
        }

        type NodeAddr

        type NodeAddr struct {
        	IP   net.IP
        	Port int
        }

        func (*NodeAddr) FromUDPAddr

        func (me *NodeAddr) FromUDPAddr(ua *net.UDPAddr)

        func (NodeAddr) MarshalBencode

        func (me NodeAddr) MarshalBencode() ([]byte, error)

        func (NodeAddr) MarshalBinary

        func (me NodeAddr) MarshalBinary() ([]byte, error)

        func (NodeAddr) String

        func (me NodeAddr) String() string

          A zero Port is taken to mean no port provided, per BEP 7.

          func (NodeAddr) UDP

          func (me NodeAddr) UDP() *net.UDPAddr

          func (*NodeAddr) UnmarshalBencode

          func (me *NodeAddr) UnmarshalBencode(b []byte) (err error)

          func (*NodeAddr) UnmarshalBinary

          func (me *NodeAddr) UnmarshalBinary(b []byte) error

          type NodeInfo

          type NodeInfo struct {
          	ID   [20]byte
          	Addr NodeAddr
          }

          func RandomNodeInfo

          func RandomNodeInfo(ipLen int) (ni NodeInfo)

          func (NodeInfo) MarshalBinary

          func (ni NodeInfo) MarshalBinary() ([]byte, error)

          func (NodeInfo) String

          func (me NodeInfo) String() string

          func (*NodeInfo) UnmarshalBinary

          func (ni *NodeInfo) UnmarshalBinary(b []byte) error

          type Return

          type Return struct {
          	ID     ID                  `bencode:"id"`               // ID of the queried node
          	Nodes  CompactIPv4NodeInfo `bencode:"nodes,omitempty"`  // K closest nodes to the requested target
          	Nodes6 CompactIPv6NodeInfo `bencode:"nodes6,omitempty"` // K closest nodes to the requested target
          	Token  *string             `bencode:"token,omitempty"`  // Token for future announce_peer
          	Values []NodeAddr          `bencode:"values,omitempty"` // Torrent peers
          
          	// BEP 33
          	BFsd *ScrapeBloomFilter `bencode:"BFsd,omitempty"`
          	BFpe *ScrapeBloomFilter `bencode:"BFpe,omitempty"`
          }

          func (Return) ForAllNodes

          func (r Return) ForAllNodes(f func(NodeInfo))

          type ScrapeBloomFilter

          type ScrapeBloomFilter [256]byte

          func (*ScrapeBloomFilter) AddIp

          func (me *ScrapeBloomFilter) AddIp(ip net.IP)

            Note that if you intend for an IP to be in the IPv4 space, you might want to trim it to 4 bytes with IP.To4.

            func (*ScrapeBloomFilter) EstimateCount

            func (me *ScrapeBloomFilter) EstimateCount() float64

            type Want

            type Want string
            const (
            	WantNodes  Want = "n4"
            	WantNodes6 Want = "n6"
            )