Documentation
¶
Overview ¶
Package krpc supplies the KRPC message used by DHT.
Index ¶
- Constants
- type Addr
- func (a Addr) Equal(o Addr) bool
- func (a Addr) MarshalBencode() (b []byte, err error)
- func (a Addr) MarshalBinary() (data []byte, err error)
- func (a Addr) Network() string
- func (a Addr) String() string
- func (a Addr) UDPAddr() *net.UDPAddr
- func (a *Addr) UnmarshalBencode(b []byte) (err error)
- func (a *Addr) UnmarshalBinary(data []byte) error
- func (a Addr) Valid() bool
- func (a Addr) WriteBinary(w io.Writer) (n int, err error)
- type CompactIPv4Addrs
- type CompactIPv4Nodes
- type CompactIPv6Addrs
- type CompactIPv6Nodes
- type Error
- type Message
- type Node
- type QueryArg
- type ResponseResult
- type Want
Constants ¶
const ( // BEP 5 ErrorCodeGeneric = 201 ErrorCodeServer = 202 ErrorCodeProtocol = 203 ErrorCodeMethodUnknown = 204 // BEP 44 ErrorCodeMessageValueFieldTooBig = 205 ErrorCodeInvalidSignature = 206 ErrorCodeSaltFieldTooBig = 207 ErrorCodeCasHashMismatched = 301 ErrorCodeSequenceNumberLessThanCurrent = 302 )
Predefine some error code.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Addr ¶
type Addr struct { IP net.IP // For IPv4, its length must be 4. Port uint16 // The original network address, which is only used by the DHT server. Orig net.Addr }
Addr represents an address based on ip and port, which implements "Compact IP-address/port info".
See http://bittorrent.org/beps/bep_0005.html.
func NewAddrFromUDPAddr ¶
NewAddrFromUDPAddr converts *net.UDPAddr to a new Addr.
func ParseAddrs ¶
ParseAddrs parses the address from the string s with the format "IP:PORT".
func (Addr) MarshalBencode ¶
MarshalBencode implements the interface bencode.Marshaler.
func (Addr) MarshalBinary ¶
MarshalBinary implements the interface encoding.BinaryMarshaler,
func (*Addr) UnmarshalBencode ¶
UnmarshalBencode implements the interface bencode.Unmarshaler.
func (*Addr) UnmarshalBinary ¶
UnmarshalBinary implements the interface encoding.BinaryUnmarshaler.
type CompactIPv4Addrs ¶
type CompactIPv4Addrs []Addr
CompactIPv4Addrs is a set of IPv4 Addrs.
func (CompactIPv4Addrs) MarshalBencode ¶
func (cas CompactIPv4Addrs) MarshalBencode() (b []byte, err error)
MarshalBencode implements the interface bencode.Marshaler.
func (CompactIPv4Addrs) MarshalBinary ¶
func (cas CompactIPv4Addrs) MarshalBinary() ([]byte, error)
MarshalBinary implements the interface encoding.BinaryMarshaler.
func (*CompactIPv4Addrs) UnmarshalBencode ¶
func (cas *CompactIPv4Addrs) UnmarshalBencode(b []byte) (err error)
UnmarshalBencode implements the interface bencode.Unmarshaler.
func (*CompactIPv4Addrs) UnmarshalBinary ¶
func (cas *CompactIPv4Addrs) UnmarshalBinary(b []byte) (err error)
UnmarshalBinary implements the interface encoding.BinaryUnmarshaler.
type CompactIPv4Nodes ¶
type CompactIPv4Nodes []Node
CompactIPv4Nodes is a set of IPv4 Nodes.
func (CompactIPv4Nodes) MarshalBencode ¶
func (cns CompactIPv4Nodes) MarshalBencode() (b []byte, err error)
MarshalBencode implements the interface bencode.Marshaler.
func (CompactIPv4Nodes) MarshalBinary ¶
func (cns CompactIPv4Nodes) MarshalBinary() ([]byte, error)
MarshalBinary implements the interface encoding.BinaryMarshaler.
func (*CompactIPv4Nodes) UnmarshalBencode ¶
func (cns *CompactIPv4Nodes) UnmarshalBencode(b []byte) (err error)
UnmarshalBencode implements the interface bencode.Unmarshaler.
func (*CompactIPv4Nodes) UnmarshalBinary ¶
func (cns *CompactIPv4Nodes) UnmarshalBinary(b []byte) (err error)
UnmarshalBinary implements the interface encoding.BinaryUnmarshaler.
type CompactIPv6Addrs ¶
type CompactIPv6Addrs []Addr
CompactIPv6Addrs is a set of IPv6 Addrs.
func (CompactIPv6Addrs) MarshalBencode ¶
func (cas CompactIPv6Addrs) MarshalBencode() (b []byte, err error)
MarshalBencode implements the interface bencode.Marshaler.
func (CompactIPv6Addrs) MarshalBinary ¶
func (cas CompactIPv6Addrs) MarshalBinary() ([]byte, error)
MarshalBinary implements the interface encoding.BinaryMarshaler.
func (*CompactIPv6Addrs) UnmarshalBencode ¶
func (cas *CompactIPv6Addrs) UnmarshalBencode(b []byte) (err error)
UnmarshalBencode implements the interface bencode.Unmarshaler.
func (*CompactIPv6Addrs) UnmarshalBinary ¶
func (cas *CompactIPv6Addrs) UnmarshalBinary(b []byte) (err error)
UnmarshalBinary implements the interface encoding.BinaryUnmarshaler.
type CompactIPv6Nodes ¶
type CompactIPv6Nodes []Node
CompactIPv6Nodes is a set of IPv6 Nodes.
func (CompactIPv6Nodes) MarshalBencode ¶
func (cns CompactIPv6Nodes) MarshalBencode() (b []byte, err error)
MarshalBencode implements the interface bencode.Marshaler.
func (CompactIPv6Nodes) MarshalBinary ¶
func (cns CompactIPv6Nodes) MarshalBinary() ([]byte, error)
MarshalBinary implements the interface encoding.BinaryMarshaler.
func (*CompactIPv6Nodes) UnmarshalBencode ¶
func (cns *CompactIPv6Nodes) UnmarshalBencode(b []byte) (err error)
UnmarshalBencode implements the interface bencode.Unmarshaler.
func (*CompactIPv6Nodes) UnmarshalBinary ¶
func (cns *CompactIPv6Nodes) UnmarshalBinary(b []byte) (err error)
UnmarshalBinary implements the interface encoding.BinaryUnmarshaler.
type Error ¶
Error represents a response error.
func (Error) MarshalBencode ¶
MarshalBencode implements the interface bencode.Marshaler.
func (*Error) UnmarshalBencode ¶
UnmarshalBencode implements the interface bencode.Unmarshaler.
type Message ¶
type Message struct { // Transaction ID // // Required T string `bencode:"t"` // BEP 5 // Message Type: "q" for QUERY, "r" for RESPONSE, "e" for ERROR // // Required Y string `bencode:"y"` // BEP 5 // Query Method: one of "ping", "find_node", "get_peers", "announce_peer" // // Required only if "y" is equal to "q". Q string `bencode:"q,omitempty"` // BEP 5 A QueryArg `bencode:"a,omitempty"` // BEP 5: Only for the QUERY message R ResponseResult `bencode:"r,omitempty"` // BEP 5: Only for the RESPONSE message E Error `bencode:"e,omitempty"` // BEP 5: Only for the ERROR message RO bool `bencode:"ro,omitempty"` // BEP 43: ReadOnly }
Message represents messages that nodes in the network send to each other as specified by the KRPC protocol, which are also referred to as the KRPC messages.
The message is a dictonary that is "bencoded" (serialization & compression format adopted by the BitTorrent) and sent via the UDP connection to peers.
There are three types of messages: QUERY, RESPONSE, ERROR.
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.
func NewErrorMsg ¶
NewErrorMsg return a ERROR message.
func NewQueryMsg ¶
NewQueryMsg return a QUERY message.
func NewResponseMsg ¶
func NewResponseMsg(tid string, data ResponseResult) Message
NewResponseMsg return a RESPONSE message.
func (Message) ID ¶
ID returns the QID or RID.
Notice: it will panic if the the message is not a query or response.
func (Message) IsResponse ¶
IsResponse reports whether the message is a RESPONSE message.
type Node ¶
Node represents a node information.
func (Node) MarshalBinary ¶
MarshalBinary implements the interface encoding.BinaryMarshaler, which implements "Compact node info".
func (*Node) UnmarshalBinary ¶
UnmarshalBinary implements the interface encoding.BinaryUnmarshaler, which implements "Compact node info".
type QueryArg ¶
type QueryArg struct { // ID is used to identify a querying node. ID metainfo.Hash `bencode:"id"` // BEP 5 // Target is used to identify the node sought by the queryer. // // find_node Target metainfo.Hash `bencode:"target,omitempty"` // BEP 5 // InfoHash is the infohash of the torrent file. // // get_peers, announce_peer InfoHash metainfo.Hash `bencode:"info_hash,omitempty"` // BEP 5 // Port is the port on where sender is listening to allow others // to download the torrent. // // announce_peer Port uint16 `bencode:"port,omitempty"` // BEP 5 // Token is the received one from an earlier "get_peers" query. // // announce_peer Token string `bencode:"token,omitempty"` // BEP 5 // ImpliedPort is used by the senders to apparent DHT port // to improve NAT support. // // announce_peer ImpliedPort bool `bencode:"implied_port,omitempty"` // BEP 5 // Wants is only used to represent to expect "nodes" for "n4" // or "nodes6" for "n6". // // Notice: It only governs the presence of the "nodes" and "nodes6" // parameters, not the interpretation of "values". // // find_node, get_peers Wants []Want `bencode:"want,omitempty"` // BEP 32 }
QueryArg represents the arguments used by the QUERY message.
func (QueryArg) ContainsWant ¶
ContainsWant reports whether the request contains the given Want.
type ResponseResult ¶
type ResponseResult struct { // ID is used to indentify the queried node, that's, the response node. ID metainfo.Hash `bencode:"id"` // BEP 5 // Nodes is a string containing the compact node information for the list // of the ipv4 target node, or the K(8) closest good nodes in routing table // of the requested ipv4 target. // // find_node Nodes CompactIPv4Nodes `bencode:"nodes,omitempty"` // BEP 5 // Nodes6 is a string containing the compact node information for the list // of the ipv6 target node, or the K(8) closest good nodes in routing table // of the requested ipv6 target. // // find_node Nodes6 CompactIPv6Nodes `bencode:"nodes6,omitempty"` // BEP 32 // Token is used for future "announce_peer". // // get_peers Token string `bencode:"token,omitempty"` // BEP 5 // Values is a list of the torrent peers. // // For each element, in general, it is a compact IP-address/port info and // may be decoded to Addr, for example, // // addrs := make([]Addr, len(values)) // for i, v := range values { // addrs[i].UnmarshalBinary([]byte(v)) // } // // get_peers Values []string `bencode:"values,omitempty"` // BEP 5 }
ResponseResult represents the results used by the RESPONSE message.